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

标签 c++ qt qt5 qapplication

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

它有效地工作。

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

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

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

现在我只有两个问题:

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

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

    最佳答案

    我认为这是您的 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();
    }
    

    enter image description here

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

    QGuiApplication::setPalette 被记录为更改默认调色板,所以基本上我认为默认调色板是指在小部件未指定另一个时使用的调色板;不是默认的系统调色板。

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

    关于c++ - Qt:获取当前应用程序调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38665150/

    相关文章:

    c++ - 在 QT Creator 中使用 makefile

    c++方法可见性继承通过g++中的不同命名空间

    Qt - QTreeView 和带有复选框列的自定义模型

    python - 将 QTableWidget 单元格链接到网页

    layout - 错误的调整大小 GUI。 Qt Designer 中布局的可能误用

    mysql - 打开 MySQL 数据库时应用程序崩溃

    c++ - 变量未定义,但在我的构造函数 C++ 中明确定义

    c++ - 如何定义模板类的模板

    c++ - Qt : Display a picture during application loading

    c++ - 如何在小部件上单击 "What' s“此”按钮时得到通知?