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

Posted

技术标签:

【中文标题】Qt:获取当前应用程序调色板【英文标题】:Qt: Getting the current application palette 【发布时间】:2016-07-29 18:15:50 【问题描述】:

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

而且效果很好。

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

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

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

现在我只有 2 个问题:

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

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

【问题讨论】:

你有测试用例吗? @peppe 这是一个非常大的 qt/kde 应用程序... @peppe 但这是一个记录在案的行为 似乎是 Qt 中的一个错误。您可以实现自己的 Application : QApplication 类并自己解决此问题。你也可以向 Qt 投诉它。就我个人而言,我还注意到 Qt 中有一些令人讨厌的地方。我通常会制作自定义实现来弥补它们。 【参考方案1】:

我认为这是您的 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()-&gt;setPalette 时我无法编译它,因为QApplication 没有定义instance(),但它属于QCoreApplication::instance(),它显然返回QCoreApplication。当你写这个问题时,可能只是一个错字,但我认为它值得几行。鉴于与调色板相关的方法是静态的,我决定在示例中使用这些方法,但使用来自 qApp 的单例时我得到了相同的结果。

【讨论】:

代码 QApplication::instance()-&gt;setPalette 适用于 Qt 4,因此我猜这个问题最初是针对 Qt 4 提出的。 @BenjaminBihler 感谢您指出这一点,我已经很久没有使用 Qt 4 了。可能问题被错误地标记为 qt5 这只是一个错字,但QTimer::singleShot() 期望 ms 中的值(并且你给了1000),它不是 "100ms" i> 但应该输出 "1s" @Fareanor 谢谢,已修复!它以 100 毫秒执行,但后来更改为其他实验为 1 秒 不,不是 Qt4。来自 Qt5 文档:The QApplication object is accessible through the instance() function that returns a pointer equivalent to the global qApp pointer.

以上是关于Qt:获取当前应用程序调色板的主要内容,如果未能解决你的问题,请参考以下文章

聊聊Qt中的Widget调色板QPalette

[Qt Creator 快速入门] 第8章 界面外观

如何获取 Qt 应用程序的当前工作目录路径?

使用 C++\Qt 从当前窗口中获取选定的文本

Qt 按钮调色板

Qt 在样式表中使用调色板颜色