Щелкните правой кнопкой мыши на QHeaderView внутри QTreeView - PullRequest
2 голосов
/ 20 апреля 2010

Я написал потомка QTreeView с несколькими столбцами.Я хочу создать всплывающее меню, которое появляется, когда пользователь щелкает правой кнопкой мыши заголовки столбцов.Я пытался поймать сигналы от QTreeView для этого, но QTreeView, похоже, не излучает сигналы на заголовках.QTreeView.header () делает.Поэтому я считаю, что я должен либо:
1: подключить один из сигналов QHeaderView к функции всплывающего окна - я не смог найти сигнал, вызываемый одним щелчком правой кнопки мыши - я пробовал sectionClicked, sectionHandleDoubleClicked, sectionDoubleClicked, sectionPressed (не удивился, что функции двойного щелчка не уловили ни одного щелчка правой кнопкой мыши - но они действительно ловят двойной щелчок правой кнопкой мыши)

self.header().sectionClicked.connect(self.headerMenu)
self.header().sectionHandleDoubleClicked.connect(self.headerMenu)
self.header().sectionDoubleClicked.connect(self.headerMenu)
self.header().sectionPressed.connect(self.headerMenu)

или,
2: написать потомок QHeaderView с моей собственной функцией MousePressEventи использовать это для моих заголовков.До сих пор мне не удалось подключить новый класс заголовка к потомку QTreeView.Я продолжаю получать ошибку сегментации во время выполнения, без объяснения причин.

#in DiceView's init, where DiceHeaders is the QHeaderView descendant
self.setHeader(DiceHeaders())

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 21 апреля 2010

Я обнаружил функцию setContextMenuPolicy:

self.header().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.header().customContextMenuRequested.connect(self.headerMenu)

Тогда в заголовке меню:

def headerMenu(self, pos):
    globalPos = self.mapToGlobal(pos)
    menu = QMenu()
    menu.addAction("test item")
    selectedItem = menu.exec_(globalPos)
    if selectedItem:
        print "selected: ", selectedItem
0 голосов
/ 21 апреля 2010

Я бы пошел к решению № 2: написать свой собственный класс, наследующий QHeaderView. Ваша ошибка сегментации может происходить из-за сбоя python / pyqt? Вы должны убедиться, что ваш объект DiceHeaders существует, сохранив ссылку на него.

...