如何在 eventFilter 中设置 QFrame 颜色?
How to set QFrame color in an eventFilter?
我有一个简单的 QWidget,它包含一个框架和两个标签。我想使用 eventFilter 更改标签悬停时的 QFrame 背景颜色。有人可以检查下面的代码并告诉我为什么我不能更改 QFrame 背景,这是否是正确的方法?
import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, \
QGraphicsDropShadowEffect, QPushButton, QApplication, QComboBox, QFrame, QLabel
from PyQt5 import QtCore
class MainWindow(QWidget):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.layout = QHBoxLayout(self)
self.frame = QFrame(self)
self.setObjectName("frame")
self.frame_lay = QHBoxLayout()
self.one_label = QLabel(self.frame)
self.one_label.setText("one")
self.one_label.setObjectName("one")
self.two_label = QLabel(self.frame)
self.two_label.setText("two")
self.two_label.setObjectName("two")
self.one_label.installEventFilter(self)
self.two_label.installEventFilter(self)
self.frame_lay.addWidget(self.one_label)
self.frame_lay.addWidget(self.two_label)
self.frame.setStyleSheet("""QFrame{background-color: red;}""")
self.frame.setLayout(self.frame_lay)
self.frame_lay.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.frame)
self.setLayout(self.layout)
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.Enter:
if type(obj) == QLabel:
if obj.objectName() in ["one", "two"]:
print(obj.objectName())
self.frame.setStyleSheet("""QFrame#frame{background-color: blue;}""")
return super(QWidget, self).eventFilter(obj, event)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
installEventFilter应该应用于QWidget还是QFrame?标签包含在 QFrame 中。
谢谢
您为 "MainWindow" 设置了 frame
对象名称,但在事件过滤器中您使用了 QFrame class 的对象名称。
只需为框架设置对象名称即可:
self.frame.setObjectName("frame")
请注意,QLabel 继承自 QFrame,因此,使用 QFrame{background-color: red;}
在技术上为父框架 和 任何子标签应用背景。
如果您想要更具体,您可以像在事件过滤器中那样使用对象名称,或者使用 .ClassName
选择器,它将 sheet 仅应用于 class 和不是它的子 classes(注意 QFrame
之前的句号):
self.frame.setStyleSheet(""".QFrame{background-color: red;}""")
我有一个简单的 QWidget,它包含一个框架和两个标签。我想使用 eventFilter 更改标签悬停时的 QFrame 背景颜色。有人可以检查下面的代码并告诉我为什么我不能更改 QFrame 背景,这是否是正确的方法?
import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, \
QGraphicsDropShadowEffect, QPushButton, QApplication, QComboBox, QFrame, QLabel
from PyQt5 import QtCore
class MainWindow(QWidget):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.layout = QHBoxLayout(self)
self.frame = QFrame(self)
self.setObjectName("frame")
self.frame_lay = QHBoxLayout()
self.one_label = QLabel(self.frame)
self.one_label.setText("one")
self.one_label.setObjectName("one")
self.two_label = QLabel(self.frame)
self.two_label.setText("two")
self.two_label.setObjectName("two")
self.one_label.installEventFilter(self)
self.two_label.installEventFilter(self)
self.frame_lay.addWidget(self.one_label)
self.frame_lay.addWidget(self.two_label)
self.frame.setStyleSheet("""QFrame{background-color: red;}""")
self.frame.setLayout(self.frame_lay)
self.frame_lay.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.frame)
self.setLayout(self.layout)
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.Enter:
if type(obj) == QLabel:
if obj.objectName() in ["one", "two"]:
print(obj.objectName())
self.frame.setStyleSheet("""QFrame#frame{background-color: blue;}""")
return super(QWidget, self).eventFilter(obj, event)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
installEventFilter应该应用于QWidget还是QFrame?标签包含在 QFrame 中。
谢谢
您为 "MainWindow" 设置了 frame
对象名称,但在事件过滤器中您使用了 QFrame class 的对象名称。
只需为框架设置对象名称即可:
self.frame.setObjectName("frame")
请注意,QLabel 继承自 QFrame,因此,使用 QFrame{background-color: red;}
在技术上为父框架 和 任何子标签应用背景。
如果您想要更具体,您可以像在事件过滤器中那样使用对象名称,或者使用 .ClassName
选择器,它将 sheet 仅应用于 class 和不是它的子 classes(注意 QFrame
之前的句号):
self.frame.setStyleSheet(""".QFrame{background-color: red;}""")