Почему класс, унаследовавший другой класс, не дает таких же результатов, как «другой класс»? - PullRequest
2 голосов
/ 29 марта 2019

Я занимаюсь разработкой приложения на Python с использованием PyQt5. Вот этот код:

class Dialog(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.layout = QtWidgets.QGridLayout()
        self.main = QtWidgets.QWidget()
        self.main.setLayout(self.layout)

        self.setStyleSheet(QMainWindowStyle)
        self.setCentralWidget(self.main)
        self.show()

class AppearanceTab(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

class SettingsDialog(Dialog):
    def __init__(self):
        super().__init__()
        self.tabs = QtWidgets.QTabWidget(self)
        self.tabs.setStyleSheet(QTabWidgetStyle)
        self.layout.addWidget(self.tabs)

        self.tab_appearance = AppearanceTab()
        self.tab_appearance.setStyleSheet(QWidgetStyle)
        self.tab_appearance_layout = QtWidgets.QGridLayout()
        self.tab_appearance.setLayout(self.tab_appearance_layout)
        self.tabs.addTab(self.tab_appearance, "Appearance")

        self.tab_server = QtWidgets.QWidget()
        self.tab_server.setStyleSheet(QWidgetStyle)
        self.tab_server_layout = QtWidgets.QGridLayout()
        self.tab_server.setLayout(self.tab_server_layout)
        self.tabs.addTab(self.tab_server, "Server")

Почему self.tab_appearance является экземпляром AppearanceTab (который должен быть копией QWidget), он имеет стиль, отличный от self.tab_server (т. Е. Цвет фона меняется), когда self.tab_server является экземпляром QWidget?

Таблица стилей просто определяет background-color: #333333 и color: #dddddd.

Заранее спасибо.

EDIT:

Я считаю, что таблица стилей не применяется должным образом к AppearanceTab, однако я не знаю, почему это будет видно, поскольку она просто наследуется от QWidget.

РЕДАКТИРОВАТЬ 2:

MCVE (вместе с остальной частью моего проекта) можно найти на github .

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Попробуйте:

from PyQt5 import QtWidgets

class Dialog(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.layout = QtWidgets.QGridLayout()
        self.main = QtWidgets.QWidget()
        self.main.setLayout(self.layout)

#        self.setStyleSheet(QMainWindowStyle)
        self.setCentralWidget(self.main)
        self.show()

class AppearanceTab(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

class SettingsDialog(Dialog):
    def __init__(self):
        super().__init__()
        self.tabs = QtWidgets.QTabWidget(self)
#        self.tabs.setStyleSheet(QTabWidgetStyle)
        self.layout.addWidget(self.tabs)

        self.tab_appearance = AppearanceTab()
#        self.tab_appearance.setStyleSheet(QWidgetStyle)
##        self.tab_appearance.setStyleSheet("QWidget, QWidget * {color: #dddddd; background-color: #333333;}") #note: Tried this however it didn't work.
        self.tab_appearance_layout = QtWidgets.QGridLayout()
        self.tab_appearance.setLayout(self.tab_appearance_layout)
        self.tabs.addTab(self.tab_appearance, "Appearance")

        self.tab_server = QtWidgets.QWidget()
#        self.tab_server.setStyleSheet(QWidgetStyle)
        self.tab_server_layout = QtWidgets.QGridLayout()
        self.tab_server.setLayout(self.tab_server_layout)
        self.tabs.addTab(self.tab_server, "Server")



style = """
QWidget {
    color: #dddddd;
    background-color: #333333;
}

QMainWindow {
    color: #dddddd;
    background-color: #333333;
}

QTabWidget {
    background-color: #333333;
    color: #dddddd;
}
QTabBar {
    color: #dddddd;
    background-color: #333333;
}
"""

if __name__ == "__main__":
    QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create("Fusion"))
    app = QtWidgets.QApplication([])
    app.setStyleSheet(style)                       # < ---
    d = SettingsDialog()
    print(app.exec_())
1 голос
/ 29 марта 2019

В документации есть параграф , параграф о наследовании и стиле:

Наследование

В классическом CSS, когда шрифт и цвет элемента не установлены явно, он автоматически наследуется от родителя. При использовании таблиц стилей Qt виджет не наследует автоматически свои настройки шрифта и цвета от родительского виджета.

Если мы хотим установить цвет для QGroupBox и его дочерних элементов, мы можем написать:

qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");

Так что вы, вероятно, хотите изменить

QMainWindowStyle = QMainWindow {color: #dddddd; background-color: #333333;}

до

QMainWindowStyle = QMainWindow, QMainWindow * {color: #dddddd; background-color: #333333;} 

чтобы все дочерние виджеты главного окна имели одинаковый стиль.

...