8

如何通过全局样式表设置作为小部件文本(例如 QLabel)一部分的跨度?

例如在下面的例子中,foobar都应该是红色的。

#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跨度所做的那样对样式进行硬编码。目标是让应用程序的外观完全由用户提供的样式表(css在示例中由 表示)决定。目前,我使用一种解决方法,为每个有色元素使用单独的标签,维护起来简直是一场噩梦。

我已经查阅了一些在线资源以及 Blanchette/Summerfield 第 19 章,但它们主要关注的是整个小部件的样式。

4

1 回答 1

5

如果您不需要在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");

这个系统有点难以阅读,但它可能是对使用 many QLabels 的改进。

(您可能已经注意到,Qt 不支持在 QLabels 中选择 CSS 类。)

于 2014-12-26T20:10:21.060 回答