Qt:获取当前应用程序调色板

Qt: Getting the current application palette

我有一个 class 组成调色板并使用 QApplication::instance()->setPalette(QPalette palette) 将其分配给应用程序。

而且效果很好。

但后来我尝试使用 QPalette QApplication::instance()->palette() 来提取一些颜色。

但在这里它不起作用,它只是 returns 默认调色板,而不是当前调色板。

在我发现它按预期和文档中描述的方式工作后。

现在我只有两个问题:

  1. 为什么它以如此奇怪、无用且违反直觉的方式工作 模式?
  2. 如何检索使用 设置的调色板 QApplication::instance()->setPalette(QPalette palette)?

P.S。不,我不能把那个调色板放在别处。

我认为这是你的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, [=]() { // 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(),这显然 returns 一个 QCoreApplication。可能只是您写问题时的错字,但我认为它值得几行。鉴于与调色板相关的方法是静态的,我决定在示例中使用这些方法,但我使用来自 qApp.

的单例得到了相同的结果