2

複数の列を持つQTreeViewの子孫を作成しました。ユーザーが列ヘッダーを右クリックしたときに表示されるポップアップメニューを作成したいと思います。このためにQTreeViewからの信号をキャッチしようとしましたが、QTreeViewはヘッダーで信号を送信していないようです。QTreeView.header()はそうします。したがって、次のいずれかを行う必要があると思います
。1:QHeaderViewのシグナルの1つをポップアップ関数に接続します-右クリックでトリガーされるシグナルを見つけることができませんでした-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:独自のMousePressEvent関数を使用してQHeaderViewの子孫を記述し、それをヘッダーに使用します。これまでのところ、新しいヘッダークラ​​スをQTreeViewの子孫に接続することに失敗しています。実行時にセグメンテーション違反が発生し続けますが、これ以上の説明はありません。

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

何か案は?

4

2 に答える 2

5

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
于 2010-04-20T23:40:56.967 に答える
0

私は解決策n°2に行きます:QHeaderViewを継承する独自のクラスを作成します。セグメンテーション違反は、Python / pyqtの不具合が原因である可能性がありますか?DiceHeadersオブジェクトへの参照を保持することにより、そのオブジェクトが存在することを確認する必要があります。

于 2010-04-21T06:19:20.743 に答える