hacer clic derecho en QHeaderView interior de QTreeView
-
28-09-2019 - |
Pregunta
He escrito un descendiente de QTreeView con múltiples columnas. Quiero crear un menú emergente que aparece Whe nEl usuario hace clic en los encabezados de columna. He intentado la captura de señales de QTreeView para esto, pero QTreeView no parece Emitir señales en las cabeceras. QTreeView.header () lo hace. Por lo tanto, creo que debe:
1: una conexión de señales de QHeaderView a una función emergente - No he sido capaz de encontrar una señal que se desencadena en un solo click derecho - He tratado sectionClicked, sectionHandleDoubleClicked, sectionDoubleClicked, sectionPressed (no sorprendió a los dobles funciones de clic no tomar un simple clic derecho - pero lo hacen coger un doble clic derecho)
self.header().sectionClicked.connect(self.headerMenu)
self.header().sectionHandleDoubleClicked.connect(self.headerMenu)
self.header().sectionDoubleClicked.connect(self.headerMenu)
self.header().sectionPressed.connect(self.headerMenu)
o,
2: escribir un descendiente de QHeaderView con mi propia función MousePressEvent, y el uso que para mis cabeceras. He tenido éxito hasta ahora en la conexión de la nueva clase de cabecera a la descendencia QTreeView. Sigo recibiendo un error de segmentación en tiempo de ejecución, sin más explicación.
#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())
¿Alguna idea?
Solución
Me descubrió la función setContextMenuPolicy:
self.header().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.header().customContextMenuRequested.connect(self.headerMenu)
A continuación, en headerMenu:
def headerMenu(self, pos):
globalPos = self.mapToGlobal(pos)
menu = QMenu()
menu.addAction("test item")
selectedItem = menu.exec_(globalPos)
if selectedItem:
print "selected: ", selectedItem
Otros consejos
Me gustaría ir a la solución n ° 2: Escribir su propia clase que hereda QHeaderView. Su fallo de segmentación puede venir de una pitón / pyqt problema técnico? Usted debe asegurarse de que existe le DiceHeaders objeto manteniendo una referencia a él.