Un clic droit sur QHeaderView intérieur de QTreeView
-
28-09-2019 - |
Question
J'ai écrit un descendant de QTreeView avec plusieurs colonnes. Je veux créer un menu contextuel qui apparaît WHE nle droit d'utilisateur clics sur les en-têtes de colonnes. J'ai essayé la capture des signaux de QTreeView pour cela, mais QTreeView ne semble pas émettre des signaux sur les en-têtes. QTreeView.header () fait. Je crois donc que je dois soit:
1: connecter l'un des signaux de QHeaderView à une fonction pop-up - je suis incapable de trouver un signal qui est déclenché sur un seul clic droit - J'ai essayé sectionClicked, sectionHandleDoubleClicked, sectionDoubleClicked, sectionPressed (pas surpris les fonctions double clic n'a pas pris un simple clic droit - mais ils attrapent un double clic droit)
self.header().sectionClicked.connect(self.headerMenu)
self.header().sectionHandleDoubleClicked.connect(self.headerMenu)
self.header().sectionDoubleClicked.connect(self.headerMenu)
self.header().sectionPressed.connect(self.headerMenu)
ou,
2: écrire un descendant de QHeaderView avec ma propre fonction mousePressEvent, et l'utiliser pour mes en-têtes. Je l'ai été jusqu'à présent pas réussi à relier la nouvelle classe d'en-tête au descendant QTreeView. Je continue à obtenir une erreur de segmentation sur l'exécution, sans plus d'explications.
#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())
Toutes les idées?
La solution
Je découvre la fonction setContextMenuPolicy:
self.header().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.header().customContextMenuRequested.connect(self.headerMenu)
Alors, dans headerMenu:
def headerMenu(self, pos):
globalPos = self.mapToGlobal(pos)
menu = QMenu()
menu.addAction("test item")
selectedItem = menu.exec_(globalPos)
if selectedItem:
print "selected: ", selectedItem
Autres conseils
J'aller pour la solution n ° 2: Écrivez votre propre classe héritant QHeaderView. Votre erreur de segmentation peut venir d'un pépin python / pyqt? Vous devez vous assurer que vous l'objet de DiceHeaders existe en gardant une référence.