Как игнорировать первое событие мыши в меню QToolButton, чтобы предотвратить нежелательный выбор элементов - PullRequest
0 голосов
/ 24 января 2020

Я создал пользовательскую производную 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

1 Ответ

0 голосов
/ 24 января 2020

aboutToShow() и aboutToHide() являются сигналами , а не методами, поэтому их нельзя "переопределить".

Создайте слот для установки переменной в 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
...