Как установить цвет QFrame в eventFilter? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть простой 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.

Спасибо

1 Ответ

0 голосов
/ 01 мая 2020

Вы задали имя объекта frame для «MainWindow», но в фильтре событий вы использовали имя объекта для класса QFrame.

Вместо этого просто установите имя объекта для фрейма:

    self.frame.setObjectName("frame")

Обратите внимание, что QLabel наследуется от QFrame, поэтому при использовании QFrame{background-color: red;} технически применяется фон для родительского фрейма и любой дочерней метки.
В случае, если вы хотите быть более Указывая c, вы либо используете имя объекта, как и в фильтре событий, либо используете селектор .ClassName, который применяет лист только к классу, а не к его подклассам (обратите внимание на символ полной остановки перед QFrame) :

    self.frame.setStyleSheet(""".QFrame{background-color: red;}""")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...