0

メニューが閉じる前に複数のエントリを選択できるように、同僚がカスタム QMenu 派生物を作成しました。

QToolButton を介してトリガーされます。

問題は、メニューが十分に大きい場合、ボタンと重なってしまうことです。QToolButton をクリックすると、現在のカーソル位置にあるアイテムが即座に選択されます。

どうすればこれを防ぐことができますか?

メニューのコードで、最初のイベントを Bool フラグで無視しようとしましたが、うまくいきません。

class StayOpenMenu(QMenu):
    """
    a class that overrides the QMenu mouseReleaseEvent to let the menu stay open when an element is selected
    """
    def __init__(self, parent=None):
        self.isfirstEvent = True
        super().__init__("Stay open Menu", parent=parent)

    def mouseReleaseEvent(self, a0: QMouseEvent):
        if self.isfirstEvent:
            a0.ignore()
            self.isfirstEvent = False
            return
        try:
            action = self.actionAt(a0.pos())
            action.trigger()
        except:
            pass
    
    def aboutToShow(self):
        self.isfirstEvent = True
        return super().aboutToShow()

    def aboutToHide(self):
        self.isfirstEvent = True
        return super().aboutToShow()

画像:ボタンクリック前

画像: QToolButton をクリックした後

4

1 に答える 1

0

aboutToShow()andaboutToHide()はメソッドではなくシグナルであるため、「オーバーライド」することはできません。

変数を True に設定するためのスロットを作成し、aboutToShow信号のみに接続します。
また、mousePressEvent も処理する必要があることに注意してください。マウス クリック (ほとんどの場合、キーボードからツール ボタンを押すことによる) によってメニューがアクティブ化されない場合、正当なリリース イベントを受け取ることができなくなります。

class StayOpenMenu(QMenu):
    def __init__(self, parent=None):
        self.isfirstEvent = False
        super().__init__("Stay open Menu", parent=parent)
        self.aboutToShow.connect(self.isShowing)

    def isShowing(self):
        self.isfirstEvent = True

    def mousePressEvent(self, a0: QMouseEvent):
        self.isfirstEvent = False
        super().mousePressEvent(a0)

    def mouseReleaseEvent(self, a0: QMouseEvent):
        if self.isfirstEvent:
            a0.ignore()
            self.isfirstEvent = False
            return
        try:
            action = self.actionAt(a0.pos())
            action.trigger()
        except:
            pass
于 2020-01-24T12:44:37.967 に答える