qlabel无法触发鼠标释放事件

时间:2019-07-18 08:26:28

标签: python pyqt pyqt5 qlabel

我有一个父级QLabel,并创建了一个子级QLabel以显示一些文本。当我单击子QLabel时,父QLabel上的mousePressEvent可以,但是无法触发mouseReleaseEvent。 代码是:

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

class MyLabel(QLabel):

    def __init__(self):
        super(MyLabel, self).__init__()
        self.label = QLabel('hello<br/> world', self)
        self.label.adjustSize()
        self.label.setStyleSheet(
            "background-color: {};".format(QColor(255, 0, 0).name())
        )
        self.label.move(QPoint(50, 50))
        self.label.setFrameShape(QFrame.NoFrame)

    def mousePressEvent(self, QMouseEvent):
        super(MyLabel, self).mousePressEvent(QMouseEvent)
        print('press')

    def mouseReleaseEvent(self, QMouseEvent):
        super(MyLabel, self).mouseReleaseEvent(QMouseEvent)
        print('release')

class Window(QLabel):
    def __init__(self):
        super(Window, self).__init__()
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.label = MyLabel()
        self.label.setFrameShape(QFrame.Box)
        self.label.setStyleSheet("border-width: 2px;border-style: solid;border-color: rgb(0, 255, 0);")
        self.layout.addWidget(self.label)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())

我发现原因是子QLabel中的文本。如果我将文本显示为“ hello world”而不是“ hello <.br /> world”,则在单击“ hello world” QLabel时鼠标释放信号正常。因此,如果需要显示“ hello <.br />世界”,如何解决此错误?

2 个答案:

答案 0 :(得分:4)

在mousePressEvent的情况下,该事件从父级传递给子级,并且如果父级接受该事件,则该子级不会通过,但是默认情况下,父级会忽略该事件(因为儿子消费了该事件),但与子级消费的mouseReleaseEvent不同事件,因此不会通知家长。

如果您想更好地理解鼠标事件的概念,请阅读以下文章:

在这种情况下,还有另一种方法可以避免禁用@Romha Korev所示的激活标记Qt::WA_TransparentForMouseEvents的小部件:

self.label = QLabel('hello<br/> world', self)
self.label.setAttribute(Qt.WA_TransparentForMouseEvents)

这将使QLabel下方的窗口小部件接收鼠标事件,就好像QLabel不存在一样。

答案 1 :(得分:0)

当您按下 hello world 标签上方的鼠标按钮时,MyLabel会将事件广播给其子级。

所以 hello world 标签将是最终的接收者。并且一旦接收到新闻事件,它将自动为发布事件的接收者。

如果要处理MyLabel中的所有事件,只需在构造函数中添加self.label.setDisabled(True)即可禁用标签:press事件将仅限于MyLabel还将收到发布事件。