PyQTを使用して、カスタムリストでQComboBoxのmousePressEventをどのようにフィルタリングしますか
質問
カスタムリストオブジェクトを含む 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を取得する必要があります。
役立つことを願っています!