Щелчок правой кнопкой мыши на 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())

Любые идеи?


person taynaron    schedule 20.04.2010    source источник


Ответы (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
person taynaron    schedule 20.04.2010

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

person tharibo    schedule 21.04.2010