2013-11-04 72 views
7

如何通过全局样式表设置作为窗口小部件文本一部分的跨度(例如 QLabel)?使用全局样式选择器设置文本区域QSS

E.g.在下面的例子中,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 

Unsatisfactory result

我会很感激,避免硬编码的风格和我一样 与FOO跨度的解决方案。 目标是让应用程序看起来完全由用户提供的样式表 确定(在本例中以css表示)。 目前我使用一种解决方法,涉及每个元素 单独的标签,它是有色的,这是一个噩梦来维护。

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

回答

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 s的改进。

(您可能已经注意到,Qt doesn't support CSS selection of classes within QLabels。)