在pyqt5中,如何在单击鼠标右键的同时在QPushbutton上触发HoverCenter事件?

2024-05-05 03:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在QDialog中有两个按钮,buttonA和buttonB。当我用鼠标点击buttonA并移动光标时,鼠标仍然点击buttonB,我无法检测到HoverEnter事件。这可能是由于pyqt将鼠标抓取设置为buttonA。我找不到一种方法来检测输入事件,当鼠标在输入按钮时被点击。 示例代码:

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

我的平台是基于Python3.7和Pyqt5的Windows10

我还尝试在第一次鼠标单击后忽略()事件,以丢失鼠标抓取和if self.buttonB.underMouse():(在事件筛选器中)但仍然没有成功


Tags: selfeventinitdef事件鼠标按钮qtwidgets
1条回答
网友
1楼 · 发布于 2024-05-05 03:14:20

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

代码中存在各种各样的问题,使您无法获得想要的:

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

最后,当另一个小部件通过单击按钮“抓取”鼠标时,无法跟踪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)

相关问题 更多 >