Bonjour,

J'essaie de créer en pyqt5, une liste (QListView) contenant des items (QstandardItem) qui puissent être triés par glissé-déposé et possèdent une case à cocher.*

L'implémentation suivante à l'air de fonctionner, mais je n'arrive pas à forcer la sélection (mise en surbrillance) d'un item,
notamment, à la fin du glisser-déposer, où la sélection reste sur le même index/ligne et ne suit pas l'item

Le signal rowsInserted me permet de récupérer l'item concerné et le nouvel index, mais je peine à trouver comment les utiliser pour faire changer la sélection

Voici l'implémentation de la classe en question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
import sys
 
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtCore import Qt, QModelIndex, QItemSelectionModel
from PyQt5.QtWidgets import (
    QMainWindow,
    QApplication,
    QListView,
    QAbstractItemView,
)
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
 
        elements = [
            {'name' : 'bob',   'state' : True},
            {'name' : 'alice', 'state' : True},
            {'name' : 'marc',  'state' : False},
            {'name' : 'eve',   'state' : True}
        ]
 
        listeWdg = OrderNChooseWdg(elements)
        self.setCentralWidget(listeWdg)
 
    def keyPressEvent(self, e):
 
        if e.key() == Qt.Key_Escape:
            QApplication.quit()
 
class OrderNChooseWdg(QListView):
 
    def __init__(self, elements):
        super().__init__()
 
        self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setDefaultDropAction(Qt.MoveAction)
        self.setDragDropOverwriteMode(False)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)
        self.setDragEnabled(True)
 
        self.model = QStandardItemModel(self)
        self.model.itemChanged.connect(self.test)
        self.model.rowsInserted.connect(self.test2)
 
        #self.selection_model = QItemSelectionModel(self.model)
 
        self.setModel(self.model)
 
        for elt in elements:
            self.add_item(elt['name'], elt['state'])
 
        self.get_states()
 
    def test(self, e):
        print('== item changed ===')
        self.get_states()
 
    def test2(self, item, index, _):
        print("== rows inserted ==")
 
    def add_item(self, name, state):
 
        item = QStandardItem(name)
 
        item.setCheckable(True)
        item.setUserTristate(False)
        item.setCheckState(state)
        item.setDragEnabled(True)
        item.setDropEnabled(False)
 
        self.model.appendRow(item)
 
    def get_states(self):
 
        for i in range(self.model.rowCount()):
            name = self.model.item(i).text()
            state = self.model.item(i).checkState()
            print(name, state)
 
if __name__ == "__main__":
 
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
(pyqt5.15.2 / python3.9)