我认为这是与您的Qt版本有关(您将问题标记为Qt 5,但没有指明具体版本),或者您的项目中存在其他重置调色板的内容(您提到它具有庞大的代码库)。
此最小示例展示了正确的行为,至少在Qt 5.12.3 32位、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, [=]() {
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()
,显然返回一个QCoreApplication
。可能只是您在写问题时打错了字,但我认为这值得一些解释。鉴于与调色板相关的方法是静态的,我决定在示例中使用这些方法,但是使用qApp
的单例也可以得到相同的结果。
Application:QApplication
类并自行修复此问题。您也可以向Qt抱怨。就我个人而言,我还注意到了Qt中的许多烦人之处。我通常会制作自定义实现来弥补它们。 - Osama Kawish