【问题标题】:Using variables in qt StyleSheets在 qt StyleSheets 中使用变量
【发布时间】:2026-02-04 15:55:01
【问题描述】:

是否有可能在 .qss 文件中为 hex/rgb 数字提供变量名称。嗯

myColor = #FFCC08
QPushButton { background-color: myColor;}

这样我就可以在样式表的顶部定义变量,并在需要时使用变量名称,而不是使用十六进制代码。另外,如果我需要更改颜色,那么我必须在一个地方进行更改,它将通过文件反映出来。

我也搜索了Saas,但不知道在qt中如何使用。

谢谢:)

【问题讨论】:

    标签: qt qtstylesheets


    【解决方案1】:

    您可以很容易地构建自己的小型 Sass:

    1.创建一个包含变量定义的文本文件。使用这样的简单格式:

    @myColor  = #FFDDEE
    @myColor2 = #112233 
    @myWidth  = 20px
    

    2.在qss文件中使用变量名:

    QPushButton { 
        background-color: @myColor; 
        min-width: @myWidth;
    }
    

    3.打开这两个文件,并且对于定义文件中的每个变量,使用定义文件中的值(字符串)更改其在 qss 文件中的出现。这是一个简单的字符串替换。

    4.在应用中应用预处理的qss。

    这是最简单的解决方案。您可以在应用程序外部更改定义文件和 qss 文件并应用它而无需重新编译代码。

    【讨论】:

    • 感谢您的宝贵时间。我使用相同的逻辑创建自己的解析器,将 .qss 文件中定义的每个自定义变量颜色替换为实际颜色。
    【解决方案2】:

    使用纯 Qt 样式表根本不可能完成您想要完成的任务。

    您可以通过在 C++ 代码中修改和重新加载样式表来实现类似的效果,例如:

    QString myColor = "#FFCC08";
    QString styleSheet = "QPushButton { background-color: %1;}";
    ...
    myWidget->setStyleSheet( styleSheet.arg(myColor) );
    

    不幸的是,这有几个缺点(无法在设计器中预览、更改代码而不是样式表),但它与您使用 Qt 实现的目标非常接近。

    【讨论】:

    • 是的,我理解,但上述方法的问题是我们在 c++ 代码中为每个组件指定样式表属性,而不是从 .qss 文件中读取。感谢您的宝贵时间。
    【解决方案3】:

    这是使用sass 的解决方案。首先,安装 python 绑定:

    pip install sass
    

    然后,使用它:

    import sys
    import sass
    app = QApplication(sys.argv)
    
    # Create your sass style sheet (you can also write this in a file and load the file)
    style = '''
    $bg-dark: #292929;
    
    QPushButton {
    color: red;
    background-color: $bg-dark;
    }
    '''.encode('utf-8')
    
    # Compile Sass to CSS
    style = sass.compile_string(style).decode()
    
    # And set it to your app
    app.setStyleSheet(style)
    

    【讨论】:

    • 如果您仍然使用 Python,为什么不使用带有 kwargs 的内置字符串格式,而不是 sass?例如。 '... background-color: {bg_dark}; ...'.format(..., bg_dark='#292929', ...)
    • 好点,这也适用于这个特定的答案。但是 sass 可以做的不仅仅是替换变量,比如 mixins、导入、嵌套规则等。最终,您可以更轻松、更优雅地为复杂的应用程序设置样式。
    【解决方案4】:

    实现此目的的另一种方法是使用动态属性。这将使您可以轻松地将多个属性分配给一个对象或一组对象,有点像将一个 css 类分配给一个对象。 https://wiki.qt.io/Dynamic_Properties_and_Stylesheets

    例如,在您的 UI 文件中,您可以添加一个值为“myStyle1”的字符串动态属性“colorStyle”。

    您的样式表如下所示:

    QPushButton[colorStyle='myStyle1'] {
        background-color: #FFCC08;
        ... any other style changes...
    }
    

    如果您在全局范围内设置,您分配“myStyle1”的任何 QPushButton 都将遵循样式表。

    【讨论】: