Bonjour à toutes et tous,
Je ne parviens pas à rendre la première colonne de mon TableView/Model non Editable; (c'est une référence créée automatiquement par l'application)
Dans le code, ci-dessous, la fonction flags du modèle semble positionner le flag Qt.ItemIsEditable(valeur 2) correctement, (flags=161 si absent, et 163 si présent) pourtant toutes les cases sont éditables, avec des EditText pour la majorité, et des "combos" sur la colonne no2 (3ème colonne)

Comme mensioné en commentaire dans le code ci-dessous, je vois bien que Qt.ItemIsTristate est présent par défaut (bien que réputé obsolète); je ne l'ai pas spécifié, et je ne vois pas d'interaction possible (pas de CheckBox)

Précisons enfin: Mon TableView/Model peut traiter 5 tables identifiées par model.noTbl.

Mon environnement : linux-ubuntu 16.04 LTS, Python 3.6.9, PYSide2 5.13.2

Edition: J'ai trouvé un "bug" qui ne change rien à ma question: Dans la fonction setModelData , la chaîne du print doit être "Dans setModelData " et non "Dans setEditorData " ... désolé
Le code:
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
 
#class TouteTableModel(QtCore.QAbstractTableModel):
#    ...
#    ... (ici simplement la fin de la classe (fonction flags(self, index)))
    def flags(self, index):
        fl = QtCore.QAbstractTableModel.flags(self, index)
        #print("Dans flags: de base ", int(fl)) 
        # donne 161, soit ItemIsTristate(128), ItemIsEnabled(32), ItemIsSelectable(1)
        #print(int(QtCore.Qt.ItemIsEditable))
        # donne 2
        if self.noTbl==0: fl |= QtCore.Qt.ItemIsEditable    # Bandes
        if self.noTbl==1 and index.column()!=0: fl |= QtCore.Qt.ItemIsEditable  # Cultures
        if self.noTbl==2: fl |= QtCore.Qt.ItemIsEditable    # Façons
        if self.noTbl==3: fl |= QtCore.Qt.ItemIsEditable    # docProd
        if self.noTbl==4 and index.column()!=0: fl |= QtCore.Qt.ItemIsEditable  #Actions
        print("Dans flags: pour (",self.noTbl,",",index.column(),")=", int(fl))
        # donne pour (4,0)=161, pour (4,1)=163, pour (4,2)=163, pour (4,3)=163, pour (4,4)=163
        # attention: pas de confusion; ici les cinq colonnes de la table no 4
        return fl
        #return QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEditable|QtCore.Qt.ItemIsEnabled
"""
0   Qt.NoItemFlags          It does not have any properties set.
1   Qt.ItemIsSelectable     It can be selected.
2   Qt.ItemIsEditable       It can be edited.
4   Qt.ItemIsDragEnabled    It can be dragged.
8   Qt.ItemIsDropEnabled    It can be used as a drop target.
16  Qt.ItemIsUserCheckable  It can be checked or unchecked by the user.
32  Qt.ItemIsEnabled        The user can interact with the item.
64  Qt.ItemIsAutoTristate   The item’s state depends on the state of its children. (ed.: QTreeWidget)
128 Qt.ItemIsTristate       This enum value is deprecated. Use instead.
256 Qt.ItemNeverHasChildren The item never has child items. (ed.: for optimization purposes only.)
512 Qt.ItemIsUserTristate   The user can cycle through three separate states. (ed.: Qt 5.5.)
"""
 
class TouteTableDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        model= index.model()
        if model.noTbl==4 and index.column()==2:
            print("Dans createEditor ", model.noTbl, index.column())
            combo = QtWidgets.QComboBox(parent)
            combo.addItems(model.comboItems)
            combo.currentIndexChanged.connect(self.onCurrentComboIndexChanged)
            return combo
        else: return QtWidgets.QStyledItemDelegate.createEditor(self, parent, option, index)
 
    def onCurrentComboIndexChanged(self, ix):
            print("Dans combo changed")
            editor = self.sender()
            self.commitData.emit(editor)
            self.closeEditor.emit(editor, QtWidgets.QAbstractItemDelegate.NoHint)
 
    def setEditorData(self, editor, index):
        model= index.model()
        if model.noTbl==4 and index.column()==2:
            text = index.data(QtCore.Qt.EditRole)
            print("Dans setEditorData ", text)
            editor.setCurrentText(text)
        else: QtWidgets.QStyledItemDelegate.setEditorData(self, editor, index);
 
 
    def setModelData(self, editor, model, index):
        model= index.model()
        if model.noTbl==4 and index.column()==2:
            text = editor.currentText()
            print("Dans setEditorData ", text)
            model.setData(index, text)
        else: QtWidgets.QStyledItemDelegate.setModelData(self, editor, model, index);
 
    def paint(self, painter, option, index):
        if isinstance(self.parent(), QtWidgets.QAbstractItemView):
            self.parent().openPersistentEditor(index)
        QtWidgets.QStyledItemDelegate.paint(self, painter, option, index)
La console:
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
 
cs@cs-Vaio:~/Documents/Ateliers/Atl-Log/AptBureau$ python AptBureau.py
['PrepBin', 'PrepSem', 'Pluie', 'SemPoq']
(ed.: ce sont les lignes des "combo", 3ème colonne de la table)
Dans flags: pour ( 4 , 0 )= 161
Dans flags: pour ( 4 , 1 )= 163
Dans flags: pour ( 4 , 2 )= 163
Dans createEditor  4 2
Dans setEditorData  PrepBin
Dans flags: pour ( 4 , 3 )= 163
Dans flags: pour ( 4 , 4 )= 163
Dans flags: pour ( 4 , 0 )= 161
Dans flags: pour ( 4 , 1 )= 163
Dans flags: pour ( 4 , 2 )= 163
Dans createEditor  4 2
Dans setEditorData  SemPoq
Dans combo changed
Dans flags: pour ( 4 , 3 )= 163
Dans flags: pour ( 4 , 4 )= 163
Dans flags: pour ( 4 , 0 )= 161
Dans flags: pour ( 4 , 1 )= 163
Dans flags: pour ( 4 , 2 )= 163
Dans createEditor  4 2
Dans setEditorData  PrepSem
Dans combo changed
Dans flags: pour ( 4 , 3 )= 163
Dans flags: pour ( 4 , 4 )= 163
...
...
(ed.: fin de la session)
Dans flags: pour ( 4 , 0 )= 161
Dans flags: pour ( 4 , 1 )= 163
Dans flags: pour ( 4 , 2 )= 163
Dans flags: pour ( 4 , 3 )= 163
Dans flags: pour ( 4 , 4 )= 163
cs@cs-Vaio:~/Documents/Ateliers/Atl-Log/AptBureau$