【问题标题】:How to set QFrame color in an eventFilter?如何在 eventFilter 中设置 QFrame 颜色?
【发布时间】:2020-05-01 19:27:32
【问题描述】:

我有一个简单的 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 中。

谢谢

【问题讨论】:

    标签: pyqt5 qframe eventfilter


    【解决方案1】:

    您为“MainWindow”设置了 frame 对象名称,但在事件过滤器中,您将对象名称用于 QFrame 类。

    只需设置框架的对象名称即可:

        self.frame.setObjectName("frame")
    

    请注意,QLabel 继承自 QFrame,因此,从技术上讲,使用 QFrame{background-color: red;} 会为父框架任何子标签应用背景。
    如果您想更具体一点,您可以像在事件过滤器中那样使用对象名称,也可以使用 .ClassName 选择器,它将工作表仅应用于类而不是其子类(请注意之前的句号字符QFrame):

        self.frame.setStyleSheet(""".QFrame{background-color: red;}""")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多