Таблица стилей Qt5: применять стиль только к настройкам по умолчанию - PullRequest
0 голосов
/ 12 мая 2018

Я играю с таблицами стилей в Qt5. Вот пример:

QWidget {
    color: #b1b1b1;
    background-color: #323232;
    font-size: 12px;
}

QSpinBox, QDoubleSpinBox {
    color: black;
    background-color: darkorange;
}

QLabel {
    background-color: transparent;
}

затем я устанавливаю таблицу стилей в основном:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyle("Fusion");

    Widget w;
    QFile file("://mystylesheet");
    file.open(QFile::ReadOnly);
    QString stylesheet = file.readAll();
    file.close();
    w.setStyleSheet(stylesheet);
    w.show();

    return a.exec();
}

Но оно перезаписывает любое пользовательское значение, которое я установил в редакторе форм. Вместо этого я хочу прямо противоположное: таблица стилей должна установить свойства по умолчанию для элементов управления, затем я могу переопределить их, установив другое значение в редакторе.

Возможно и как?

Например: я мог бы хотеть иметь некоторые метки с другим цветом фона: если я установлю один в редакторе, он не должен быть перезаписан таблицей стилей.

1 Ответ

0 голосов
/ 12 мая 2018

Если вы хотите, чтобы свойства, записанные в форме, не были перезаписаны вашим .qss, тогда вы должны использовать селектор #, например, если у вашего QLabel есть customlabel objectName, вы можете установить его наиспользуйте следующую форму:

QLabel#customlabel { 
    background-color: gray 
}

Пример:

#include <QApplication>
#include <QLabel>
#include <QVBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    const std::string qss = R"(QWidget {
                            color: #b1b1b1;
                            background-color: #323232;
                            font-size: 12px;
                            }

                            QSpinBox, QDoubleSpinBox {
                            color: black;
                            background-color: darkorange;
                            }

                            QLabel {
                            background-color: transparent;
                            })";

    QWidget w;
    QVBoxLayout lay(&w);
    for(const QString & name: {"label1", "label2", "label3"}){
        QLabel *label = new QLabel(name);
        label->setObjectName(name);
        lay.addWidget(label);
    }
    QLabel *label = new QLabel("customlabel");
    label->setObjectName("customlabel");
    lay.addWidget(label);
    // emulate the Qt Designer form
    label->setStyleSheet("QLabel#customlabel{ background-color: gray }");

    // use .qss
    w.setStyleSheet(QString::fromStdString(qss));
    w.show();

    return a.exec();
}

Вывод:

enter image description here

...