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
。
这意味着,以下代码不会更改QLineEdit
的background-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
,因为 QLineEdit
的 background-color
必须是动态的。
我的问题:如何将QLineEdit
的背景色与QPalette::base
连接起来,以使用QPalette
动态定义QLineEdit
的background-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 在样式表中使用调色板颜色的主要内容,如果未能解决你的问题,请参考以下文章