QTreeWidget - clicked vs itemSelectionChanged
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 :mur:
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:
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_()) |