如何在 QPalette 中使用 QPROPERTY?

Posted

技术标签:

【中文标题】如何在 QPalette 中使用 QPROPERTY?【英文标题】:How to use QPROPERTY in QPalette? 【发布时间】:2018-04-23 13:20:38 【问题描述】:

我正在尝试使用样式表中设置的 Q_PROPERTY 来更改 QPalette 中的值,这可能吗?例如,如果我在 MainWindow 小部件中将 QStyle 设置为 Fusion,是否可以使用此方法更改 Qt::Window 等?

一切编译正常,但显示的唯一颜色是黑色,所以变量可能填充了垃圾值?据我所知,样式表会覆盖其他所有内容,所以猜测一下,样式表没有为构造函数及时加载?

ma​​inwindow.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

stylesheet.qss

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

【问题讨论】:

【参考方案1】:

QSS 不会自动调用,它们通常会在显示小部件时更新,在您的情况下,因为未显示 themeInstance 不使用样式表。可以使用QStylepolish()方法强制绘制

class MainWindow : public QMainWindow

    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr):QMainWindowparent
        qApp->setStyleSheet("Themeqproperty-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);
    
;

【讨论】:

@RyuMake 我很好奇,你为什么要这么做? 我在单独的 qss 文件中有多个主题,可以从程序中的设置面板进行更改。我不得不使用 qss,因为很多小部件都是定制的。我想尝试使用 QStyle,因为它可以很好地处理基本小部件,所以我可以从 qss 文件中删除它们并稍微缩小它们。

以上是关于如何在 QPalette 中使用 QPROPERTY?的主要内容,如果未能解决你的问题,请参考以下文章

QPalette 初学者 - 从哪里开始

如何在 PyQt/PySide 中获取 QPalette 的组和角色?

如何从 QWidget 中删除 QPalette

如何更改 QPalette 的当前颜色组

QPalette 在 QTabBar 中不起作用?

QT动态改变控件背景颜色:用QPalette得到一个颜色m_penColor,如何让一个pushb