我有一个组合调色板的类,并使用QApplication::instance()->setPalette(QPalette palette)
将其分配给应用程序。
它确实有效。
然后我尝试使用QPalette QApplication::instance()->palette()
来提取一些颜色。
但是这里它不起作用,它只返回默认调色板,而不是当前调色板。
在我发现它按照假设工作并在文档中描述之后。
现在我只有两个问题:
QApplication::instance()->setPalette(QPalette palette)
?P.S。不,我不能把那个调色板留在别处。
答案 0 :(得分:3)
我认为这是您的Qt版本的问题(您将问题标记为Qt 5,但未指定特定版本),或者您的项目中还有其他东西正在重置调色板(您提到它有一个Qt版本)。大代码库)。
此最小示例显示了正确的行为,至少在Qt 5.12.3 32bits,Windows,VS 2017中:
#include <QApplication>
#include <QPalette>
#include <QDebug>
#include <QTimer>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const auto group = QPalette::Active;
const auto role = QPalette::Text;
auto palette = QApplication::palette();
qDebug() << "palette before:" << palette.color(group, role).name();
palette.setColor(group, role, "#123456");
qDebug() << "palette set:" << palette.color(group, role).name();
QApplication::setPalette(palette);
const auto palette2 = QApplication::palette();
qDebug() << "palette after:" << palette2.color(group, role).name();
QTimer::singleShot(100, [=]() { // check palette after the events loop has started
const auto palette3 = QApplication::palette();
qDebug() << "palette after 100ms:" << palette3.color(group, role).name();
});
QWidget w;
w.show();
return a.exec();
}
我已经用QApplication::palette
来检索不同项目中的自定义调色板,并且完全没有问题。
QGuiApplication::setPalette
记录了更改默认调色板的信息,因此基本上,我认为默认调色板是指如果某个小部件未指定其他小部件,则使用该调色板。不是默认的系统调色板。
PS:使用QApplication::instance()->setPalette
时我无法编译它,因为QApplication
没有定义instance()
,但是它属于QCoreApplication::instance()
,显然返回了{{ 1}}。当您撰写问题时,可能只是拼写错误,但我认为值得一提。鉴于与调色板相关的方法是静态的,因此我决定在示例中使用这些方法,但是使用来自QCoreApplication
的单例,我得到了相同的结果。