【问题标题】:In pyqt5 how can I have a HoverEnter event triggered on a QPushbutton while having the right button of the mouse clicked?在 pyqt5 中,如何在单击鼠标右键的同时在 QPushbutton 上触发 HoverEnter 事件?
【发布时间】:2020-03-06 15:02:01
【问题描述】:

如果我在 QDialog 中有 2 个按钮,按钮 A 和按钮 B。当我鼠标单击 buttonA 并将光标移动到仍然单击 buttonB 的鼠标时,我无法检测到 HoverEnter 事件。这可能是由于 pyqt 在 buttonA 处设置了鼠标抓取。在输入buttonB时单击鼠标时,我找不到检测输入事件的方法。 示例代码:

class MainDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(MainDialog, self).__init__()
        self.installEventFilter(self)
        self.buttonA= QtWidgets.QPushButton(MainDialog)
        self.buttonB= QtWidgets.QPushButton(MainDialog)
        self.buttonA.installEventFilter(self)
        self.buttonB.installEventFilter(self)


    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.HoverEnter:
            print("HOVERE ENTER")
            return True

我的平台是 python 3.7 和 pyqt 5 上的 windows 10

我还尝试在第一次鼠标单击后忽略()事件,以丢失鼠标抓取以及 if self.buttonB.underMouse():(在事件过滤器中)但仍然没有运气。

【问题讨论】:

    标签: python windows user-interface pyqt pyqt5


    【解决方案1】:

    简短的回答是,当在接受按钮按下事件的小部件上单击鼠标按钮时,只有 小部件会接收鼠标移动事件,直到释放鼠标按钮。

    你的代码中有各种各样的问题阻碍你得到你想要的:

    1. 您正在检查 HoverEnter,但这仅在进入小部件时未按下鼠标按钮时有效;
    2. 如果事件类型不同,您忘记返回super().eventFilter(source, event)(这非常重要);
    3. 您正在使用 class 作为按钮的参数参数;您应该改用实例 (self);
    4. “类”为小写;

    最后,当另一个小部件通过按钮单击“抓住”鼠标时,无法跟踪 enter 事件,因此您必须找到另一种方法仅获取一次,因为您只能使用鼠标移动事件来找到它.

    这是一个可能的实现:

    class MainDialog(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(MainDialog, self).__init__()
            layout = QtWidgets.QHBoxLayout(self)
            self.buttonA = QtWidgets.QPushButton('A')
            self.buttonB = QtWidgets.QPushButton('B')
            layout.addWidget(self.buttonA)
            layout.addWidget(self.buttonB)
            self.buttonA.installEventFilter(self)
            self.buttonB.installEventFilter(self)
            self.enterButton = self.pressedButton = None
    
        def eventFilter(self, source, event):
            if event.type() == QtCore.QEvent.MouseButtonPress and event.button() == QtCore.Qt.LeftButton:
                self.pressedButton = source
            elif event.type() == QtCore.QEvent.MouseMove:
                widget = QtWidgets.QApplication.widgetAt(event.globalPos())
                if widget in (self.buttonA, self.buttonB):
                    if widget != self.pressedButton:
                        if self.enterButton != widget:
                            self.enterButton = widget
                            print('Button {} entered!'.format(widget.text()))
                    else:
                        self.enterButton = None
            return super().eventFilter(source, event)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多