Как использовать QPROPERTY в QPalette?

Я пытаюсь использовать набор Q_PROPERTY в своей таблице стилей, чтобы изменить значение в QPalette, возможно ли это? Например, если я установил для QStyle значение Fusion в своем виджете MainWindow, можно ли изменить Qt::Window и т. д., используя этот метод?

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

mainwindow.cpp

#include <QStyleFactory>
#include <QWidget>
#include <QFile>
#include "theme.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
{
    QFile File("://stylesheet.qss");
    File.open(QFile::ReadOnly);
    QString StyleSheet = QLatin1String(File.readAll());
    qApp->setStyleSheet(StyleSheet);

    Theme *themeInstance = new Theme;

    QApplication::setStyle(QStyleFactory::create("Fusion"));

    QPalette dp;
    dp.setColor(QPalette::Window, QColor(themeInstance->customColor()));
    qApp->setPalette(dp);
}

theme.h

#ifndef THEME_H
#define THEME_H

class Theme : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QColor customColor READ customColor WRITE setCustomColor DESIGNABLE true)
public:
    Theme(QWidget *parent = nullptr);

    QColor customColor() const { return m_customColor; }
    void setCustomColor(const QColor &c) { m_customColor = c; }
private:
    QColor m_customColor;
};

#endif // THEME_H

таблица стилей.qss

* { // global only for test purposes
    qproperty-customColor: red;
}

person RyuMake    schedule 23.04.2018    source источник


Ответы (1)


QSS не вызывается автоматически, они обычно обновляются при отображении виджетов, в вашем случае, поскольку themeInstance не отображается, таблица стилей не используется. Покраску можно форсировать с помощью polish() метода QStyle

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr):QMainWindow{parent}{
        qApp->setStyleSheet("Theme{qproperty-customColor: red;}");
        Theme *themeInstance = new Theme;
        qApp->setStyle(QStyleFactory::create("Fusion"));
        qApp->style()->polish(themeInstance);
        QPalette dp;
        dp.setColor(QPalette::Window, QColor(themeInstance->customColor()));
        qApp->setPalette(dp);
    }
};
person eyllanesc    schedule 23.04.2018
comment
@RyuMake Мне любопытно, зачем ты это делаешь? - person eyllanesc; 24.04.2018
comment
У меня есть несколько тем в отдельных файлах qss, которые можно изменить на панели настроек в программе. Мне пришлось использовать qss, так как многие виджеты изготавливаются на заказ. Я хотел попробовать использовать QStyle, так как он довольно хорошо обрабатывает базовые виджеты, поэтому я мог удалить их из файлов qss и немного уменьшить их. - person RyuMake; 24.04.2018