6

我有一个类组成一个调色板并使用QApplication::instance()->setPalette(QPalette palette).

它有效地工作。

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

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

在我发现它按照文档中的假设和描述工作之后。

现在我只有两个问题:

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

PS 不,我不能把那个调色板放在别处。

4

1 回答 1

4

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

于 2019-10-10T05:01:04.093 回答