PyQTを使用して、カスタムリストでQComboBoxのmousePressEventをどのようにフィルタリングしますか

StackOverflow https://stackoverflow.com/questions/603528

質問

カスタムリストオブジェクトを含む QComboBox があります。

スクリーンショット

カスタムリストオブジェクトにはカスタム mousePressEvent があるため、ユーザーが+/-(ねじれた)の円のいずれかをクリックすると、リストが展開/折りたたみます。

コンボボックスでリストを使用する場合、ユーザーがツイスティをクリックすると、リストは展開/折りたたみますが、選択は変更され、リストは非表示になります。ユーザーがツイスティをクリックしたときに選択が変更されず、リストが非表示にならないように、これをどのようにフィルタリングできますか。

追加のスクリーンショット

すべてのノードが折りたたまれた: すべてのノードが折りたたまれています。

非表示のリスト: リストが非表示のスクリーンショット。

役に立ちましたか?

解決

QTには、「キャプチャ」する eventFilter があります。 QEvent.MouseButtonRelease 。したがって、ユーザーがノードをクリックすると QEvent.MouseButtonRelease イベントをフィルター処理する独自の eventFilter がインストールされます。

リストオブジェクトには次のメソッドがあります:

def mousePressEvent (self, e):
    self.colapse_expand_click = False
    if <user clicked node>:
        colapse_expand_node()
        e.accept ()
        self.colapse_expand_click = True

mousePressEvent は、 mouseReleaseEvent の前に実行されます。

次に、カスタムコンボボックスで、イベントをフィルタリングします:

class RevisionSelectorWidget(QtGui.QComboBox):
    def __init__(self, parent = None):
        QtGui.QComboBox.__init__(self, parent)

        self.log_list = RevisionSelectorLogList(self)
        self.setView(self.log_list)
        self.log_list.installEventFilter(self)
        self.log_list.viewport().installEventFilter(self)

    def eventFilter(self, object, event):
        if event.type() == QtCore.QEvent.MouseButtonRelease:
            if self.log_list.colapse_expand_click:
                return True
        return False

他のヒント

頭の外で、 QComboBox をサブクラス化し、 hideEvent(QHideEvent) QWidget から継承)

をオーバーライドできます。
def hideEvent(self, event):
  if self.OkToHide():
    event.accept()
  else:
    event.ignore()

スクリーンショットはコンボボックスの興味深い使用のように見えますが、リストの代わりに TreeView スタイルコントロールを使用していない理由について興味がありますか?

編集(2009年3月14日):

Qtのソースコードを見て、キーボードイベントとマウスイベントがキャプチャされると、qtが&quot; activated(int index)&quot;信号を送信することを決定するとすぐに表示されます、&quot; hidePopup()&quot; が呼び出されました。

イベントフィルターコードを書き換える以外に、&quot; activated(int index)&quot; または&quot; highlighted(int index)&quot; リスト項目を再レイズする&quot; showPopup()&quot; を呼び出すことができるスロットに信号を送ります。厄介な表示/非表示のペイントの問題が発生した場合、ポップアップが表示されている間にペイントイベントを遅延させるためにQtを取得する必要があります。

役立つことを願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top