PyQT标签的鼠标悬停事件过滤器

5 投票
3 回答
7295 浏览
提问于 2025-04-16 04:59

我一直在尝试把这里的例子转换成可以在一个简单的标签上使用。

这是代码:

class mouseoverEvent(QtCore.QObject):
    def __init__(self, parent):
        super(mouseoverEvent, self).__init__(parent)
    def eventFilter(self, object, event):
        if event.type() == QtCore.QEvent.MouseMove:
            print "mousemove!"
            
self.filter = mouseoverEvent(self)
self.label.installEventFilter(self.filter)

有趣的是,这段代码确实能工作,但我的控制台却一直在显示“mousemove!”(这很好),同时也出现了一个错误:TypeError: invalid result type from mouseoverEvent.eventFilter()

我还没有完全搞懂事件之间复杂的关系,所以这对我来说有点难以理解。那么,怎么回事呢?

提前谢谢你。

3 个回答

0
def eventFilter(self, object, event):
    if event.type() == QtCore.QEvent.MouseMove:
        print "mousemove!"
    return super(mouseoverEvent, self).eventFilter(object, event)

这是一个名为 `mouseoverEvent` 的类,它继承自 `QtCore.QObject`,也就是说它是一个对象,可以用来处理一些事件。

在这个类里,有一个初始化的方法 `__init__`,这个方法在创建这个类的对象时会被自动调用。它的作用是设置一些初始值。在这里,`super(mouseoverEvent, self).__init__(parent)` 这行代码是用来调用父类的初始化方法,确保父类的部分也能正常工作。

接下来是一些代码,`self.filter = mouseoverEvent(self)` 这行创建了一个 `mouseoverEvent` 的新实例,并把当前对象作为参数传给它。然后,`self.label.installEventFilter(self.filter)` 这行代码是把刚刚创建的 `filter` 安装到 `label` 上,这样 `label` 就可以接收和处理鼠标悬停的事件了。

0

看看我刚刚发现的。这是一段真实代码的片段,所以类名在我的例子中是特定的。

    def mouseMoveEvent(self, event=None):
        if self.activeLayer.layerName != 'Whiteboard': super(MapPage, self).mouseMoveEvent(event)
        else:
            if (event.buttons() & Qt.LeftButton) and self.scribbling:
                self.drawLineTo(event.scenePos())

我所做的就是重新声明了鼠标移动事件,但如果当前活动层的名字不是'白板',那么软件就会执行一个'原始'的鼠标移动事件。

9

我觉得你需要从事件过滤器里返回 TrueFalse,这样可以告诉程序你是否已经完全处理了这个事件。

撰写回答