如何在 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 等?
一切编译正常,但显示的唯一颜色是黑色,所以变量可能填充了垃圾值?据我所知,样式表会覆盖其他所有内容,所以猜测一下,样式表没有为构造函数及时加载?
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
stylesheet.qss
* // global only for test purposes
qproperty-customColor: red;
【问题讨论】:
【参考方案1】:QSS 不会自动调用,它们通常会在显示小部件时更新,在您的情况下,因为未显示 themeInstance 不使用样式表。可以使用QStyle
的polish()
方法强制绘制
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?的主要内容,如果未能解决你的问题,请参考以下文章