AttributeError:“ QHoverEvent”对象没有属性“ x”

时间:2019-07-13 00:02:31

标签: pyqt5 python-3.6

我正在尝试使用QLabel展示一种QToolTip,以在光标位于小部件上时显示消息,在这种情况下为QPushButton

我想到要在QPushButton中输入一个事件过滤器,如果该事件等于Hover,它将启动mouseMoveEvent函数。

问题在于该消息随处可见,但是当进入QPushButton时,程序将停止并引发此错误:

Traceback (most recent call last):
  File "C:\Users\Angel\Desktop\Hover.py", line 22, in eventFilter
    self.mouseMoveEvent(event)
  File "C:\Users\Angel\Desktop\Hover.py", line 26, in mouseMoveEvent
    print(event.x())
AttributeError: 'QHoverEvent' object has no attribute 'x'

目的是仅在光标进入小部件时显示消息

这是我的代码

from PyQt5.QtWidgets import QMainWindow,QApplication,QPushButton,QLabel
from PyQt5 import QtCore

class Hover(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.customToolTip = QLabel(self)

        self.button = QPushButton(self)
        self.button.setText("Button1")
        self.button.installEventFilter(self)

        self.setMouseTracking(True)


    def eventFilter(self,object,event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            print("Pressed")
            return True
        elif event.type() == QtCore.QEvent.HoverEnter:
            self.mouseMoveEvent(event)
            return True
        return False
    def mouseMoveEvent(self,event):
        print(event.x())

        self.customToolTip.setText("Otro texto")
        self.customToolTip.setStyleSheet("background:red;border-radius:5px;")
        self.customToolTip.move(QtCore.QPoint(event.x(),event.y()))
        self.customToolTip.adjustSize()
        self.customToolTip.show()



app = QApplication([])
h = Hover()
h.show()
h.resize(800,600)
app.exec_()

1 个答案:

答案 0 :(得分:2)

简单但不推荐的解决方案是更改:

self.customToolTip.move(QtCore.QPoint(event.x(),event.y()))

self.customToolTip.move(event.pos())

由于QHoverEvent没有方法x(),因此,如果要获取位置,必须使用pos()方法。

不建议使用此方法,因为您正在将事件发送到不应处理的方法,在这种情况下可能会起作用,但将来可能会给您带来麻烦。

您的问题中有以下不足的短语:启动mouseMoveEvent函数,HoverEnter仅在进入小部件时触发,在中间,它将不再触发该事件,因此不是如果要显示工具提示,则最合适。

如果希望仅在QPushButton中显示工具提示,则必须执行以下操作:

  • 在按钮上启用mouseTracking。
  • 使用MouseMove事件。
  • 让QLabel成为按钮的子代...
class Hover(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Hover, self).__init__(parent)

        self.button = QtWidgets.QPushButton(self)
        self.customToolTip = QtWidgets.QLabel(self.button)
        self.button.installEventFilter(self)
        self.button.setMouseTracking(True)
        self.button.setText("Button1")

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.MouseMove and self.button is obj:
            self.handle_tooltip(event.pos())
        return super(Hover, self).eventFilter(obj, event)

    def handle_tooltip(self, pos):
        self.customToolTip.setText("Otro texto")
        self.customToolTip.setStyleSheet("background:red;border-radius:5px;")
        self.customToolTip.move(pos)
        self.customToolTip.adjustSize()
        self.customToolTip.show()

以前的方法有一个缺点,因为小部件的子项只会在与父项的交点处绘制,如果文本太长或鼠标远离中心,则QLabel不会完全显示,以避免除了使用mapToGlobal()将本地位置转换为全球位置之外,还必须启用标志Qt :: ToolTip。

class Hover(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Hover, self).__init__(parent)

        self.button = QtWidgets.QPushButton(self)
        self.customToolTip = QtWidgets.QLabel(
            self.button, flags=QtCore.Qt.ToolTip
        )
        self.button.installEventFilter(self)
        self.button.setMouseTracking(True)
        self.button.setText("Button1")

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.MouseMove and self.button is obj:
            self.handle_tooltip(event.pos())
        return super(Hover, self).eventFilter(obj, event)

    def handle_tooltip(self, pos):
        gp = self.button.mapToGlobal(pos)
        self.customToolTip.setText("Otro texto")
        self.customToolTip.setStyleSheet("background:red;border-radius:5px;")
        self.customToolTip.move(gp)
        self.customToolTip.adjustSize()
        self.customToolTip.show()