使用全局QSS中的类选择器设置文本区域样式

时间:2013-11-04 17:39:06

标签: qt css-selectors qtstylesheets

如何设置作为窗口小部件文本一部分的跨度(例如 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

Unsatisfactory result

我真的很感激能够像我一样避免硬编码风格的解决方案 使用 foo 范围。 目标是应用程序外观完全由a确定 用户提供的样式表(在示例中由css表示)。 目前我使用的解决方法涉及每个元素的单独标签 这是有色的,维持是一场噩梦。

我咨询了一些在线消息来源以及Blanchette / Summerfield章节 19但这些主要涉及整个小部件的样式。

1 个答案:

答案 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。)