As a workaround, switching to a QListWidget (which has it's own model) works just fine :
# getting actual order
def qlistwidget_iter_items(lst: QListWidget, role=Qt.DisplayRole):
for i in range(lst.count()):
list_item = lst.item(i)
item = list_item.data(role)
yield item
adding item adapted :
pix = self.get_image(item.filename)
list_item = QListWidgetItem(QIcon(pix), "")
list_item.setData(Qt.ItemDataRole.DecorationRole, pix) # image
list_item.setData(Qt.ItemDataRole.UserRole, item) #
list_item.setSizeHint(thumbnail_size) # self.ui.lstViewAddedItems.gridSize())
flags = list_item.flags() | Qt.ItemFlag.ItemIsDragEnabled
flags &= ~Qt.ItemFlag.ItemIsDropEnabled
list_item.setFlags(flags)