为什么继承另一个类的一个类不能产生与“另一个类”相同的结果?

时间:2019-03-29 11:31:55

标签: python python-3.x pyqt pyqt5 qtstylesheets

我正在使用PyQt5在Python中开发应用程序。这是有问题的代码:

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_appearanceAppearanceTab实例(应该QWidget的副本)时,它与{{1 }}(即背景颜色改变)是self.tab_serverself.tab_server的实例吗?

样式表仅定义了QWidgetbackground-color: #333333

谢谢。

编辑:

我认为样式表未正确应用于color: #dddddd,但是我不知道为什么它只是从AppearanceTab继承而来。

编辑2:

可以找到on github的MCVE(以及项目的其余部分)。

2 个答案:

答案 0 :(得分:1)

在文档中,有一段paragraph about inheritance和样式:

  

继承

     

在经典CSS中,当未明确设置项目的字体和颜色时,它将自动从父项继承。使用Qt样式表时,小部件不会自动从其父小部件继承其字体和颜色设置。

     

如果要在QGroupBox及其子级上设置颜色,可以编写:

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

所以您可能想要更改

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

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

以便主窗口的所有子窗口小部件都具有相同的样式。

答案 1 :(得分:1)

尝试一下:

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_())