PyQT5 标签的鼠标悬停事件

Aru*_*mar 6 python qlabel pyqt5

我是 python 的新手,我希望如果我将鼠标移到带有文本停止的标签上,那么它应该将变量 Stop 的值更改为 True,以便我可以暂停/停止我的程序。我在鼠标悬停事件过滤器上查看了 PyQT 标签的代码 并尝试运行它,但没有显示任何内容请指导我......代码如下

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5 import *
import sys
class mouseoverEvent(QtCore.QObject):
    def __init__(self, parent):
        super(mouseoverEvent, self).__init__(parent)
        self.initUI()
    def eventFilter(self, object, event):
        if event.type() == QtCore.QEvent.MouseMove:
            print( "mousemove!")
            return True
        else:
            return False

    def initUI(self):
        self.filter = mouseoverEvent(self)
        self.label.installEventFilter(self.filter)
        self.lbl=QLabel(self)
        self.lbl.setText(self,"hellojjj")
        self.setGeometry(1000, 30, 300, 100)
        self.setWindowTitle('QLineEdit')

        self.show()

'''if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = mouseoverEvent()
    sys.exit(app.exec_())'''''
Run Code Online (Sandbox Code Playgroud)

我将不胜感激...

小智 7

请查找参考:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class Label(QLabel):
    def __init__(self, *args, **kwargs):
        QLabel.__init__(self, *args, **kwargs)

    def enterEvent(self, event):
        print("hovered")

    def leaveEvent(self, event):
        print("left")
Run Code Online (Sandbox Code Playgroud)


acm*_*6ou 6

请记住,Python 非常灵活,因此无需子类化QLabel。

例如:

def enter(event):
    print("Enter")

def leave(label):
    print("Leave")

label = QLabel("Hello")
label.leaveEvent = leave
label.enterEvent = enter

Run Code Online (Sandbox Code Playgroud)

或者你可以使用 lambda:

label = QLabel("Hello")
label.leaveEvent = lambda e: print("Leave")
label.enterEvent = lambda e: print("Enter")
Run Code Online (Sandbox Code Playgroud)


Cyo*_*yon 5

  1. 如果您已经导入

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    Run Code Online (Sandbox Code Playgroud)

    没有必要

    from PyQt5 import *
    
    Run Code Online (Sandbox Code Playgroud)
  2. 导入 QtCore 后,您不再需要使用“QtCore.QEvent”调用其函数/类,只需使用 QEvent 即可

  3. 我相信您链接的问题使用了 PyQt4。在 PyQt5 中,类的初始化过程发生了变化

下面的代码应该可以工作。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class mouseoverEvent(QWidget):

    def __init__(self):
        super().__init__()
        self.stop = False # your 'stop' variable
        self.initUI()

    def initUI(self):
        self.lbl=QLabel(self)
        self.lbl.setText("Hover over me to stop the program")
        self.lbl.installEventFilter(self)
        self.setGeometry(1000, 30, 300, 100)
        self.setWindowTitle('QLineEdit')

        self.show()

    def eventFilter(self, object, event):
        if event.type() == QEvent.Enter:
            print("Mouse is over the label")
            self.stop = True
            print('program stop is', self.stop)
            return True
        elif event.type() == QEvent.Leave:
            print("Mouse is not over the label")
            self.stop = False
            print('program stop is', self.stop)
        return False


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = mouseoverEvent()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

如果您只想在带有特定文本的标签上激活停止,请将 eventFilter 函数更改为:

def eventFilter(self, object, event):
    if hasattr(object, 'text'): #check to see if the object has text, otherwise if you hover over something without text, PyQt will return an error
        if object.text() == "Hover over me to stop the program":
            if event.type() == QEvent.Enter:
                print("Mouse is over the label")
                self.stop = True
                print('program stop is', self.stop)
                return True
            elif event.type() == QEvent.Leave:
                print("Mouse is not over the label")
                self.stop = False
                print('program stop is', self.stop)
    return False
Run Code Online (Sandbox Code Playgroud)