Qt 在样式表中使用调色板颜色

Posted

技术标签:

【中文标题】Qt 在样式表中使用调色板颜色【英文标题】:Qt use palette color in stylesheet 【发布时间】:2018-08-17 09:31:36 【问题描述】:

在 qt 中,您通常使用 QPalette 设置 QWidget 的颜色。

例子:

QPalette palette = new QPalette();
palette.setBrush(QPalette::Base, this->palette().backgorund());

QLineEdit *line = new QLineEdit();
line->setPalette(palette);

现在我有一个小问题。无法使用QPalette 更改 QLineEdit 的边框颜色。这意味着,我必须使用QStyleSheet

例子:

QLineEdit *line = new QLineEdit();
line.setStyleSheet("border: 1px solid green");

但是现在我不能用QPalette 设置QLineEdit 的basecolor,因为QLineEdit 的背景颜色不再连接到QPalette::base。 这意味着,以下代码不会更改QLineEditbackground-color

QPalette palette = new QPalette();
palette.setBrush(QPalette::Base, this->palette().backgorund());

QLineEdit *line = new QLineEdit();
line->setPalette(palette);
line->setStyleSheet("border: 1px solid green");

但不可能在 StyleSheet 中定义 QLineEdit 的 background-color,因为 QLineEditbackground-color 必须是动态的。

我的问题:如何将QLineEdit 的背景色与QPalette::base 连接起来,以使用QPalette 动态定义QLineEditbackground-color

【问题讨论】:

为什么不能简单地创建/格式化包含所需背景和边框值的QString 我不知道,你的意思。你的意思是,我应该创建一个继承自 QString 的类,其中包含一个背景字段和一个边框字段? - QString 中没有背景和边框属性,是吗? 【参考方案1】:

或者:

line->setStyleSheet(QStringLiteral(
    "border: 1px solid green;"
    "background-color: palette(base);"
));

参考:http://doc.qt.io/qt-5/stylesheet-reference.html#paletterole

使用 PaletteRole 还可以让 CSS 位于单独的文件/源中。

【讨论】:

这应该是正确的答案。当前接受的答案更像是“使用从调色板对象复制的颜色生成样式表”。这(根据我)与问题的陈述方式(以及我想要做的事情)相去甚远。这就是说,我似乎无法让它工作(我所有的颜色都是黑色的)。有人知道某处的工作示例吗?我找不到任何... :( 轻微修正,颜色不是黑色,但我设置的调色板颜色似乎被忽略了,我得到了一些默认调色板...... @pythonator 在小部件上使用 CSS 时,小部件的默认或分配的调色板可能会被忽略(尤其是在案例或背景/边框/框架中)。在这种情况下,PaletteRole 似乎最好在引用默认应用程序QPalette 时使用(可选地使用 QApplication::setPalette()` 设置)。确切的行为,尤其是调色板颜色如何传播(或不传播)可能取决于所使用的 Qt 样式(例如“融合”或“窗口”等)。 “Fusion”在 QPalette 继承方面是最灵活和可预测的,也可以与 CSS 混合使用。【参考方案2】:

只需在运行时构造所需的QString...

auto style_sheet = QString("border: 1px solid green;"
                           "background-color: #%1;")
  .arg(QPalette().color(QPalette::Base).rgba(), 0, 16);

上面的结果应该是QString,比如...

border: 1px solid green;
background-color: #ffffffff;

那么……

line->setStyleSheet(style_sheet);

【讨论】:

啊当然现在我明白你的意思了。这是一个简单而伟大的想法。 - 谢谢!【参考方案3】:

我找到了适合我的情况的解决方案。因为我只想遮住边框,不想给它上色,所以可以使用QLineEdit::setFrame(bool)的方法。但是,如果我想像上面的例子那样给框架上色呢?到目前为止,我还没有找到解决方案。我对每一个答案都很满意。

【讨论】:

以上是关于Qt 在样式表中使用调色板颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 QT Creator 的调色板编辑器中编辑小部件的背景颜色

如何在 OSX 上设置 Qt 的标签栏背景样式

聊聊Qt中的Widget调色板QPalette

聊聊Qt中的Widget调色板QPalette

更改 Qt 中的单选按钮文本颜色

Qt 按钮调色板