如何忽略 QToolButton 菜单中的第一个鼠标事件以防止不需要的项目选择

How to ignore the first mouse event in the QToolButton Menu to prevent unwanted selection of items

一位同事制作了一个自定义的 QMenu 衍生工具,以便在菜单关闭前可以 select 多个条目。

它通过 QToolButton 触发。

问题是如果菜单足够大,它会与按钮重叠。单击 QToolButton 时,当前光标位置的项目会立即 selected。

如何防止这种情况发生?

我的菜单代码,我试图用布尔标志忽略第一个事件,但它不起作用。

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后

aboutToShow() and aboutToHide() 信号 ,不是方法,所以它们不能是 "overridden".

创建一个用于将变量设置为 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