为啥继承另一个类的类不会产生与“另一个类”相同的结果?

Posted

技术标签:

【中文标题】为啥继承另一个类的类不会产生与“另一个类”相同的结果?【英文标题】:Why does a class inhering another class not produce the same results as 'another class'?为什么继承另一个类的类不会产生与“另一个类”相同的结果? 【发布时间】:2019-03-29 11:31:54 【问题描述】:

我正在使用 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 的副本)时,它的样式与self.tab_server 不同(即背景颜色更改)当self.tab_serverQWidget 的实例时?

样式表只定义了background-color: #333333color: #dddddd

提前致谢。

编辑:

我认为样式表没有正确应用于AppearanceTab,但是我不知道为什么会这样,因为它只是继承自QWidget

编辑 2:

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

【问题讨论】:

能否请您发布MCVE 和css 样式表? 是的,我会尝试,但是需要一段时间(要修剪很多代码/我目前在学校) @JacquesGaudin 查看我最近对 ​​MCVE 的编辑(以及我的其余代码) 谢谢,我的机器上现在没有 QT,但我可以稍后再试。我的第一个想法是将QMainWindowStyle = QMainWindow color: #dddddd; background-color: #333333; 更改为QMainWindowStyle = QMainWindow, QMainWindow * color: #dddddd; background-color: #333333;,以便主窗口的所有子窗口小部件具有相同的样式。 @JacquesGaudin 成功了,谢谢!如果你发布一个答案,我会接受。 【参考方案1】:

在文档中有一段paragraph about inheritance和style:

继承

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

如果我们想为 QGroupBox 及其子对象设置颜色,我们可以这样写:

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

所以你可能想要改变

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

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

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

【讨论】:

不幸的是,这对我不起作用。我将self.tab_appearance.setStyleSheet(QWidgetStyle) 更改为self.tab_appearance.setStyleSheet("QWidget, QWidget * background-color: #333333; color: #dddddd;") 没有成功。 我的意思是把它放在 CSS 中。你也试过吗? 我的错误,我认为这是关于子小部件而不是类继承。【参考方案2】:

试试看:

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

【讨论】:

以上是关于为啥继承另一个类的类不会产生与“另一个类”相同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在主函数之外定义一个类的对象(继承了另一个类)?

python之旅:面向对象之继承与派生

PHP 类的继承 访问修饰符 重写

096 元类

python(18):类(2)

php面向对象4部曲继承详解