QT:获取当前的应用程序选项板

时间:2016-07-29 18:15:51

标签: c++ qt qt5 qapplication

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

它确实有效。

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

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

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

现在我只有两个问题:

  1. 为什么它在如此奇怪,无用和反直觉的情况下工作 模式?
  2. 如何检索使用设置的调色板 QApplication::instance()->setPalette(QPalette palette)
  3. P.S。不,我不能把那个调色板留在别处。

1 个答案:

答案 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();
}

enter image description here

我已经用QApplication::palette来检索不同项目中的自定义调色板,并且完全没有问题。

QGuiApplication::setPalette记录了更改默认调色板的信息,因此基本上,我认为默认调色板是指如果某个小部件未指定其他小部件,则使用该调色板。不是默认的系统调色板。

PS:使用QApplication::instance()->setPalette时我无法编译它,因为QApplication没有定义instance(),但是它属于QCoreApplication::instance(),显然返回了{{ 1}}。当您撰写问题时,可能只是拼写错误,但我认为值得一提。鉴于与调色板相关的方法是静态的,因此我决定在示例中使用这些方法,但是使用来自QCoreApplication的单例,我得到了相同的结果。