【问题标题】:Mouseover event for a PyQT5 LabelPyQT5 标签的鼠标悬停事件
【发布时间】:2018-12-29 14:01:03
【问题描述】:

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

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_())'''''

我将不胜感激......

【问题讨论】:

    标签: python pyqt5 qlabel


    【解决方案1】:
    1. 如果您已经导入

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

      没必要

      from PyQt5 import *
      
    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_())
    

    如果您只想在带有特定文本的标签上激活停止,请将您的 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
    

    【讨论】:

    • 所以答案应该包含的不仅仅是发布的代码。请阅读How do I write a good answer?。这个想法是解释概念和变化,以便未来的访问者从答案中受益,即使他们的问题并不完全相同。
    【解决方案2】:

    请找到参考:

    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")
    

    【讨论】:

      【解决方案3】:

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

      例如:

      def enter(event):
          print("Enter")
      
      def leave(label):
          print("Leave")
      
      label = QLabel("Hello")
      label.leaveEvent = leave
      label.enterEvent = enter
      
      

      或者你可以使用 lambdas:

      label = QLabel("Hello")
      label.leaveEvent = lambda e: print("Leave")
      label.enterEvent = lambda e: print("Enter")
      

      【讨论】:

        猜你喜欢
        • 2020-06-25
        • 2019-02-16
        • 2018-08-13
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2012-10-12
        • 1970-01-01
        相关资源
        最近更新 更多