Щелкните правой кнопкой мыши на QHeaderView внутри QTreeView

Я написал потомок 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 ответа

Решение

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

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

Затем в headerMenu:

def headerMenu(self, pos):
    globalPos = self.mapToGlobal(pos)
    menu = QMenu()
    menu.addAction("test item")
    selectedItem = menu.exec_(globalPos)
    if selectedItem:
        print "selected: ", selectedItem

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

Другие вопросы по тегам