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

问题描述 投票:0回答:1

我制作了一个自定义的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后

“”

python pyqt pyqt5 qmenu qtoolbutton
1个回答
0
投票

aboutToShow()aboutToShow()signals,不是方法,因此不能被“重写”。

创建用于将变量设置为True的插槽,并将其仅连接到aboutToHide()信号。还要注意,您还必须注意mousePressEvent:如果未通过鼠标单击激活菜单(很可能是通过键盘按下工具按钮),它将阻止菜单接收合法的释放事件。

aboutToHide()
© www.soinside.com 2019 - 2024. All rights reserved.