Bonjour,

Je remets le nez dans un code que je n'ai pas touché depuis quelques mois et j'essaye d'améliorer l'ergonomie de l'interface.

Pour décrire rapidement l'interface, j'ai d'un coté un QTreeWidget qui me liste des items et sous items.
Et de l'autre coté de l'interface, plusieurs champs qui sortent des infos associés à ces items.

Jusqu'ici j'utilisais une ligne de code du type "self.dataview.clicked.connect(self.on_nb_selected)" et à chaque clic de souris ma fonction s'exécute parfaitement

Pour gagner en ergonomie, j'aimerai pouvoir me déplacer dans la liste du QTreeWidget avec les fleches haut et bas, et voir ma partie description se mettre à jour automatiquement.
J'ai donc remplacé clicked par itemSelectionChanged, là aussi la fonction s'exécute bien par contre l'item dans la liste n'est plus sélectionné, on ne peut pas naviguer au clavier

Je ne sais pas si c'est normal ou si c'est une erreur de programmation de ma part, je suis preneur de vos commentaires

Je vous donne une version simplifiée de mon code si ça peut aider


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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
    class for the tab UI
"""
 
from PyQt5.QtWidgets import (QLabel, QGridLayout, QWidget, QTabWidget,
                             QTreeWidget, QTreeWidgetItem)
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgets
import sys
 
import random
 
class MaList(QTreeWidget):
 
    def __init_(self):
        QTreeWidget.__init_(self)
 
        self.setColumnCount(1)
        self.setHeaderLabels([("Name")])
 
        self.view_dict_in= {}
        self.view_dict_out= {}
        self.in_items = QTreeWidgetItem([("In")])
        self.out_items = QTreeWidgetItem([("Out")])
 
        self.refresh()
        self.expandAll()
 
    def refresh(self):
 
        # to save qtreeview expanded state
        in_items_is_expanded = self.in_items.isExpanded()
        out_items_is_expanded = self.out_items.isExpanded()
 
        # to refresh the list        
        self.clear()
        self.view_dict_in= {}
        self.view_dict_out= {}
 
        self.in_items = QTreeWidgetItem([("In")])
        self.out_items = QTreeWidgetItem([("Out")])
 
        row_in=0
        row_out=0
        for row in range(1,10):
            nb_aleatoire = random.randint(1,1000)
            data=QTreeWidgetItem(str(nb_aleatoire))
            print(nb_aleatoire)
            if nb_aleatoire % 2 == 0 :
                self.in_items.addChild(data)
                self.view_dict_in[nb_aleatoire] = row_in
                row_in+=1
            else :
                self.out_items.addChild(data)
                self.view_dict_out[nb_aleatoire] = row_out
                row_out+=1
 
        self.addTopLevelItem(self.in_items)
        self.addTopLevelItem(self.out_items)
 
        # to restore Qtreeview expanded state
        self.in_items.setExpanded(in_items_is_expanded)
        self.out_items.setExpanded(out_items_is_expanded)
 
    def get_selection(self):
        row = self.currentIndex().row()  # row
        cat = self.currentIndex().parent().row()  # in/out
        if row == -1 or cat == -1:
            return None
        else:
            if cat == 0 or cat == 1:
                if cat == 0:
                    nb_aleatoire = reverse_dict(self.view_dict_in, row)
                else:
                    nb_aleatoire = reverse_dict(self.view_dict_out, row)
                return nb_aleatoire
            else:
                pass
 
class MonWidget(QWidget):
    "widget that define what is inside my tab"
 
    def __init_(self):
        QWidget.__init_(self)
 
        # #########
        # left side
        # #########
 
        self.dataview = MaList(self)
        # clicked fonctionne, navigation clavier ok, mais pas de mise à jour
        self.dataview.clicked.connect(self.on_nb_selected)
        # itemSelectionChanged fonctionne, navigation clavier nok, mais pas de mise à jour
        #self.dataview.itemSelectionChanged.connect(self.on_nb_selected)
        # currentItemChanged ne fonctionne pas
        #self.dataview.currentItemChanged.connect(self.on_nb_selected)
 
        # #########
        # right side
        # #########
        self.label_nb_name = QLabel("<h1> Test </h1>")
 
        # add treeview 
        gridlayout = QGridLayout(self)
 
        # add left and right side
        # add treeview and tabs 
        gridlayout.addWidget(self.dataview, 0, 0, 9, 3)
        gridlayout.addWidget(self.label_nb_name, 0, 3, 0, 7)
 
    def on_nb_selected(self):
        "update display when a item is selected"
 
        nb = self.dataview.get_selection()
        self.label_nb_name.setText("<h1>" + nb + "</h1>")
 
 
if __name__ == "__main__":
 
    APP = QtWidgets.QApplication(sys.argv)
    MAINWIN = MonWidget()
    #MAINWIN = MaList()
    MAINWIN.show()
    sys.exit(APP.exec_())