如何设置作为窗口小部件文本一部分的跨度(例如 a QLabel)通过全球样式表?
E.g。在下面的示例中, foo 和 bar 都应为红色。
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
class
some_label : public QLabel
{
Q_OBJECT
public:
some_label(QString text = "") : QLabel(NULL) {
setText(text);
show();
};
};
#include "main.moc"
static const char *css =
"some_label { color : blue; background : black; }"
"span.some_class { color : red; }";
int
main(int argc, char **argv)
{
QApplication a(argc, argv);
a.setStyleSheet(css);
some_label label("before "
"<span style=\"color:red;\">foo</span> " /* works */
"<span class=\"some_class\">bar</span> " /* fails */
"after");
return a.exec();
}
Qmake(Qt 5.1.1)项目文件:
QT += widgets
SOURCES += main.cpp
我真的很感激能够像我一样避免硬编码风格的解决方案
使用 foo 范围。
目标是应用程序外观完全由a确定
用户提供的样式表(在示例中由css
表示)。
目前我使用的解决方法涉及每个元素的单独标签
这是有色的,维持是一场噩梦。
我咨询了一些在线消息来源以及Blanchette / Summerfield章节 19但这些主要涉及整个小部件的样式。
答案 0 :(得分:4)
如果您在QLabel
加载后不需要更改样式,则可以设计一个系统,用文本替换集中样式文件中每个单词所需的颜色:
// These values come from a central, user-supplied style sheet, etc.
QString primary = "red";
QString secondary = "green";
some_label label("before "
"<font color=\"" + secondary + "\">foo</font> "
"<font color=\"" + primary + "\">bar</font> "
"after");
这个系统有点难以阅读,但它可能比使用许多QLabel
更好。
(您可能已经注意到,Qt doesn't support CSS selection of classes within QLabels。)