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

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

例如在下面的例子中,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 span那样硬编码风格。 目标是让应用程序看起来完全由用户提供的样式表(在该示例中用css表示)确定。 目前,我使用了一种解决方法,对每个有颜色的元素使用不同的标签,这是一个噩梦来维护。

我已经咨询了几个在线资源以及Blanchette / Summerfield第19章,但这些主要关注的是样式化整个小部件。


如果您在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不支持CSS选择QLabels中的类。)

链接地址: http://www.djcxy.com/p/75201.html

上一篇: styling text regions with class selector from global QSS

下一篇: Why is pyglet so slow compared to pygame?