如何在Qt中的特定类中为QLabel设置样式表

时间:2017-12-06 14:44:30

标签: qt stylesheet qlabel

我有一个这样的测试样本:
class B中,只有QVector来存储一些QLabel,如下所示:

class B : public QWidget
{
public:
    B(QWidget *parent = 0);

    QVector<QLabel*> mLbls;
};

class A中,我有以下代码:

A::A(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget *mWidget = new QWidget(this);
    QHBoxLayout *hLayout = new QHBoxLayout(mWidget);

    B testingB;
    testingB.mLbls.resize(5);
    for(int i = 0; i < 5; i++) {
        testingB.mLbls[i] = new QLabel(mWidget);
        testingB.mLbls[i]->setText(QString::number(i));
        hLayout->addWidget(testingB.mLbls[i]);
    }
    setStyleSheet("QLabel {background-color: red;}"); //I want to set the QLabel bg color to red

    mWidget->setLayout(hLayout);
    setCentralWidget(mWidget);
}

所以我要做的是将QLabel中的所有Class B设置为红色。但问题是,如果我使用setStyleSheet("QLabel {background-color: red;}");,则所有QLabel(甚至QLabel中的Class A)都将设置为红色背景颜色。

我不知道如何仅为CLass B对象设置所有样式表。而且我知道我可以用这种方式来实现我想要做的事情:

for(int i = 0; i < 5; i++) {
    testingB.mLbls[i] = new QLabel(mWidget);
    testingB.mLbls[i]->setText(QString::number(i));
    testingB.mLbls[i]->setStyleSheet("QLabel {background-color: red;}"); //new added
    hLayout->addWidget(testingB.mLbls[i]);
}

通过使用这种方式,我认为单独为它们逐个设置样式表非常麻烦,除此之外我有时可能需要设置一些QLabel样式表,其余部分只有相同的样式表。如果我有更多的对象并逐一设置它们,那可能会花费很多时间。
所以我假设有一种方法可以为class中的某些对象设置一次样式表。希望我能清楚地解释我的问题。要解决这个问题,我能做些什么?
谢谢。

1 个答案:

答案 0 :(得分:1)

Qt CSS语法允许您为CSS规则(Qt doc)选择子项,但它基于QObject的父项,而不是哪个类包含指向QLabel的指针。

此CSS仅适用于作为QLabel对象的子项或子项的YourContainerClassWidget个对象。

// C++
auto container = new YourContainerClassWidget;
auto label = QLabel(container); // The label is now a child of container

// CSS
YourContainerClassWidget QLabel { // Descendant selector
    background-color: red;
}

// You can also apply only to direct children with this syntax
YourContainerClassWidget > QLabel { // Child selector
    background-color: red;
}