2010-04-20 35 views
2

我已經寫了一個QTreeView的後代,它有多列。我想創建一個彈出式菜單,當用戶在列標題上單擊鼠標右鍵時出現。我試圖從QTreeView中捕獲信號,但QTreeView似乎沒有在信頭上發射信號。 QTreeView.header()會。因此,我相信我必須:
1:將QHeaderView的信號之一連接到彈出功能 - 我一直無法找到一個單擊右鍵觸發的信號 - 我試過了sectionClicked,sectionHandleDoubleClicked,sectionDoubleClicked,sectionPressed(不是驚訝雙擊功能沒有抓到一個右鍵 - 但他們趕上雙擊鼠標右鍵)右鍵單擊QTreeView裏面的QHeaderView

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後代。我一直在運行時遇到Segmentation Fault,沒有更多的解釋。

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

任何想法?

回答

3

我發現了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 
0

我會去解決N°2:寫你自己的類繼承QHeaderView。 您的分段錯誤可能來自python/pyqt小故障? 您應該確保DiceHeaders對象存在,方法是保留對它的引用。