стилизация текстовых областей с помощью селектора класса из глобального 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. Цель состоит в том, чтобы внешний вид приложения полностью определялся предоставленной пользователем таблицей стилей (обозначенной в примере css). На данный момент я использую обходной путь, включающий отдельные метки для каждого окрашенного элемента, и это кошмар для поддержания.

Я проконсультировался с несколькими онлайн-источниками, а также с главой 19 Бланшетт/Саммерфилд, но они в основном связаны со стилем целых виджетов.


person Philipp Gesang    schedule 04.11.2013    source источник


Ответы (1)


Если вам не нужно менять стиль после загрузки 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. )

person scarcegreengrass    schedule 26.12.2014