使用 Qt 样式表的类实例的样式

Posted

技术标签:

【中文标题】使用 Qt 样式表的类实例的样式【英文标题】:style for a class instance using Qt Style Sheets 【发布时间】:2019-09-03 22:22:02 【问题描述】:

我正在尝试为玩具 PyQt5 应用程序编写 CSS 样式表。我已经成功定义了一个类MainWindow(QMainWindow)DefaultWidget(QWidget),后者包含两个按钮,我正在尝试对其进行风格化。

使用 C++ 文档,我一直在尝试利用 QPushButton#evilButton 示例,提供于:Link

但是,在我的 python 应用程序中,实例名称的 # 符号似乎无法转换为外部 CSS 文件的类似 self.setStyleSheet() 方法。

Python 文件(如有拼写错误,敬请见谅 - 从另一台计算机转录):

import sys
from PyQt5.Widgets import QApplication, QMainWindow, QWidget, QPushButton, QHBoxLayout

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setStyleSheet(open('./style.css').read())
        try:
            self.setCentralWidget(DefaultWidget())
        else:
            some_error_stuff_for_troubleshooting
        self.show()

class DefaultWidget(QWidget):
    def __init__(self):
        super().__init__()
        okButton = QPushButton('OK')
        cancelButton = QPushButton('Cancel')
        hbox = QHBoxLayout()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        self.setLayout(hbox)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

在 CSS 文件中...

QWidget.MainWindow 
    background: blue

QPushButton 
    background-color: beige

QPushButton???okButton 
    background-color: green

我把??? 放在哪里我已经尝试了很多东西(尝试通过QPushButton.okButtonQPushButton.DefaultWidget.okButtonDefaultWidget.okButton.#:: 和@ 987654338@ 表示法等),但此时它比有根据的猜测更加随机。

我希望 CSS 在类名之外处理一些命名约定样式,以帮助从 python 文件中提取尽可能多的样式。即使符号恰好是正确的,由于继承的样式,我是否没有看到预期的颜色变化?


编辑:如果有人偶然发现这个,.setObjectName() 方法或在实例化小部件时声明对象名称选项。此外,如果您有兴趣,这里有一个类似的问题,关于为什么不使用某种默认名称。 PyQt: is there an better way to set objectName in code?

【问题讨论】:

所有 QSS 选择器都在Style Sheet Syntax Reference 中进行了解释。您需要添加okButton.setObjectName('okButton'),然后使用选择器QPushButton#okButton(或只是#okButton)。请注意,如果您使用 Qt Designer 设计您的 gui,对象名称将自动设置。 【参考方案1】:

试试看:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QHBoxLayout

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        #                       open('./style.css').read())
        self.setStyleSheet("""
            QWidget 
                background: blue;
            
            QPushButton 
                background-color: beige;
            
            QPushButton#okButton                              /*    <--- #okButton      */
                background-color: green;
            
        """)

        defaultWidget = DefaultWidget()
        self.setCentralWidget(defaultWidget)

        self.show()

class DefaultWidget(QWidget):
    def __init__(self):
        super().__init__()

        okButton = QPushButton('OK', objectName="okButton")     # + objectName="okButton"

        cancelButton = QPushButton('Cancel')
        hbox = QHBoxLayout()
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        self.setLayout(hbox)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

【讨论】:

谢谢。 .setObjectName 方法正是我所需要的。 @rumble_bumbles 如果我的回答有助于解决您的问题,请不要忘记将答案标记为正确。

以上是关于使用 Qt 样式表的类实例的样式的主要内容,如果未能解决你的问题,请参考以下文章

QT +样式表

qt 样式表基本用法

Qt设置样式

WebPack 为导入的样式表的类添加下划线,从而破坏反应组件的样式

11Qt样式表

[Qt]如何支持:自定义小部件样式表的按下状态?