qlabel 不能触发鼠标释放事件
the qlabel can not trigger the mouse release event
我有一个父 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/> world',如何修复这个错误?
当您在 hello world 标签上方按下鼠标按钮时,MyLabel
将向其子级广播该事件。
因此 hello world 标签将成为最终接收者。一旦它接收到新闻事件,它就会自动成为发布事件的接收者。
如果要处理MyLabel
中的所有事件,只需要在构造函数中添加self.label.setDisabled(True)
禁用标签即可:press事件将被限制为MyLabel
并且还会收到release事件。
在 mousePressEvent 的情况下,事件从 parent 传递给儿子,如果 parent 接受它,儿子将不会传递,但默认情况下 parent 忽略它是为了儿子消耗它的东西,但与 mouseReleaseEvent 不同的是,儿子消耗了事件,因此 parent 不会收到通知。
如果您想更好地理解鼠标事件的概念,请阅读以下文章:
在这种情况下,还有另一种方法可以避免禁用小部件,如 @Romha Korev that is to activate the flag Qt::WA_TransparentForMouseEvents 所示:
self.label = QLabel('hello<br/> world', self)
self.label.setAttribute(Qt.WA_TransparentForMouseEvents)
这将使 QLabel 下面的小部件接收鼠标事件,就好像 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/> world',如何修复这个错误?
当您在 hello world 标签上方按下鼠标按钮时,MyLabel
将向其子级广播该事件。
因此 hello world 标签将成为最终接收者。一旦它接收到新闻事件,它就会自动成为发布事件的接收者。
如果要处理MyLabel
中的所有事件,只需要在构造函数中添加self.label.setDisabled(True)
禁用标签即可:press事件将被限制为MyLabel
并且还会收到release事件。
在 mousePressEvent 的情况下,事件从 parent 传递给儿子,如果 parent 接受它,儿子将不会传递,但默认情况下 parent 忽略它是为了儿子消耗它的东西,但与 mouseReleaseEvent 不同的是,儿子消耗了事件,因此 parent 不会收到通知。
如果您想更好地理解鼠标事件的概念,请阅读以下文章:
在这种情况下,还有另一种方法可以避免禁用小部件,如 @Romha Korev that is to activate the flag Qt::WA_TransparentForMouseEvents 所示:
self.label = QLabel('hello<br/> world', self)
self.label.setAttribute(Qt.WA_TransparentForMouseEvents)
这将使 QLabel 下面的小部件接收鼠标事件,就好像 QLabel 不存在一样。