qlabel无法触发鼠标释放事件

Qia*_*ang 1 python pyqt qlabel pyqt5

我有一个父 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_())
Run Code Online (Sandbox Code Playgroud)

我发现原因是子 QLabel 中的文本。如果我将文本显示为“hello world”而不是“hello<.br/> world”,则当我单击“hello world”QLabel 时,鼠标释放信号正常。那么,如果我需要显示“hello <.br/> world”,如何修复这个错误?

eyl*_*esc 5

在 mousePressEvent 的情况下,事件从父级传递给子级,如果父级接受它,子级将不会被传递,但默认情况下,父级会忽略子级消耗的事件,但与 mouseReleaseEvent 不同,子级消耗事件,因此家长不会收到通知。

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

在这种情况下,还有另一种选择可以避免禁用小部件,如@Romha Korev所示,即激活标志Qt::WA_TransparentForMouseEvents

self.label = QLabel('hello<br/> world', self)
self.label.setAttribute(Qt.WA_TransparentForMouseEvents)
Run Code Online (Sandbox Code Playgroud)

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