2

QComboBoxカスタムリストオブジェクトを持っています。

スクリーンショット。

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

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

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

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

非表示のリスト: リストが非表示になっているスクリーンショット。

4

2 に答える 2

2

QTには、eventFilter「キャプチャ」する がありQEvent.MouseButtonReleaseます。だから私がしたことは、ユーザーがノードをクリックした場合にイベントeventFilterをフィルタリングする独自のインストールです。QEvent.MouseButtonRelease

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

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
于 2009-03-19T23:32:48.373 に答える
1

私の頭の上から、サブクラス化QComboBoxしてオーバーライドすることができhideEvent(QHideEvent)ました(から継承QWidget

def hideEvent(self, event):
  if self.OkToHide():
    event.accept()
  else:
    event.ignore()

あなたのスクリーンショットはコンボ ボックスの面白い使い方のように見えますが、なぜTreeViewリストの代わりにスタイル コントロールを使わなかったのですか?

編集 (2009 年 3 月 14 日):

Qt のソース コードを調べたところ、キーボードとマウスのイベントがキャプチャされたときに、qt が"activated(int index)"信号の送信を決定するとすぐ"hidePopup()"に呼び出されたように見えます。

そのため、イベント フィルター コードを書き直す以外に、"activated(int index)"or"highlighted(int index)"シグナルをスロットに接続して"showPopup()"、リスト項目を再生成する呼び出しを行うという別のオプションがあります。厄介なペイントの非表示/表示の問題が発生した場合は、ポップアップが表示されている間、Qt でペイント イベントを遅らせる必要がある場合があります。

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

于 2009-03-03T05:55:00.970 に答える