Qt中支持暗色主题

在 Qt 6.5 及更高版本中,为了支持暗色主题(dark theme),Qt 引入了一些新的特性和概念。主要是通过使用 QStyleHints 的新属性 colorScheme,这个属性可以根据用户的系统偏好设置为 Qt::ColorScheme::LightQt::ColorScheme::DarkQt::ColorScheme::Unknown。这允许应用程序根据用户的系统偏好来决定使用明亮或暗色的应用程序调色板。并且,QStyleHints 还提供了一个 colorSchemeChanged 信号,让应用程序能够响应系统颜色方案的变化。

但是,Qt 6.5 建议不再手动制作调色板,而是使用系统的调色板,这是基于用户的偏好设置的。在一些样式中,如 Windows Vista 样式,它们可能会忽略系统调色板,并用不同的调色板覆盖它。而像 “Fusion” 或经典 Windows 样式这样的样式则与任何调色板都兼容,不会修改应用程序的调色板。

要在 C++ 应用程序中使用暗色主题,你可以采取以下步骤:

  1. 设置兼容的样式:首先,设置一个与暗色主题兼容的样式,如 “Fusion” 样式。

  2. 加载和应用调色板:然后,根据需要加载并应用暗色调色板。

ColorGroup 枚举

  1. Active:活动状态。用于窗口或控件处于焦点或活动状态时。
  2. Disabled:禁用状态。用于窗口或控件被禁用,即不可交互时。
  3. Inactive:非活动状态。用于窗口或控件没有焦点,且不是活动状态时。
  4. NColorGroups:颜色组数量,不用于颜色设置,通常用于数组或循环的边界。
  5. Current:当前状态。特定于某些控件,表示当前选中或激活的状态。
  6. All:所有状态。用于应用颜色设置至所有状态。
  7. Normal:等同于Active,表示正常的活动状态。

ColorRole 枚举

  1. WindowText:窗口文本颜色。
  2. Button:按钮面颜色。
  3. Light:亮色部分,通常用于阴影和高亮。
  4. Midlight:中等亮度颜色。
  5. Dark:暗色部分。
  6. Mid:中等暗度颜色。
  7. Text:一般文本颜色。
  8. BrightText:鲜亮的文本颜色。
  9. ButtonText:按钮上的文本颜色。
  10. Base:控件的背景颜色。
  11. Window:窗口背景颜色。
  12. Shadow:阴影颜色。
  13. Highlight:高亮颜色,用于表示选中或聚焦。
  14. HighlightedText:在高亮背景上的文本颜色。
  15. Link:链接颜色。
  16. LinkVisited:已访问链接的颜色。
  17. AlternateBase:用于交替行或区域的背景颜色。
  18. NoRole:未指定角色。
  19. ToolTipBase:工具提示的背景颜色。
  20. ToolTipText:工具提示的文本颜色。
  21. PlaceholderText:占位符文本颜色。
  22. Accent:强调色,用于突出显示。
  23. NColorRoles:颜色角色的数量,用于数组或循环的边界。

以下是一个使用暗色主题的 Qt Widgets 应用程序的示例代码:

#include "mainwindow.h"
#include <QApplication>
#include <QStyleFactory>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 设置兼容的样式
    QApplication::setStyle(QStyleFactory::create("Fusion"));
    // 创建并应用暗色调色板
    QPalette darkPalette;
    darkPalette.setColor(QPalette::Window, QColor(53, 53, 53));
    darkPalette.setColor(QPalette::WindowText, Qt::white);
    darkPalette.setColor(QPalette::Base, QColor(25, 25, 25));
    darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
    darkPalette.setColor(QPalette::ToolTipBase, Qt::white);
    darkPalette.setColor(QPalette::ToolTipText, QColor(162, 162, 162));
    darkPalette.setColor(QPalette::Text, Qt::white);
    darkPalette.setColor(QPalette::Button, QColor(53, 53, 53));
    darkPalette.setColor(QPalette::ButtonText, Qt::white);
    darkPalette.setColor(QPalette::BrightText, Qt::red);
    darkPalette.setColor(QPalette::Link, QColor(255, 183, 47));
    darkPalette.setColor(QPalette::Highlight, QColor(255, 183, 47));
    darkPalette.setColor(QPalette::HighlightedText, Qt::black);
    // 设置禁用状态下的窗口文本颜色
    darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, Qt::gray);
    // 设置禁用状态下的按钮文本颜色
    darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::gray);
    a.setPalette(darkPalette);

    MainWindow w;
    w.show();
    return a.exec();
}

这个示例设置了一个暗色的调色板,并应用到整个应用程序中。请注意,这里使用的颜色是示例,你可以根据需要自定义这些颜色以更好地适应你的应用程序设计。

这种设置暗色主题的方法同样适用于 Qt 5.15.11。在 Qt 5 中,虽然没有内置的暗色主题支持,但你可以通过手动设置应用程序的调色板来实现暗色主题。

这段代码在 Qt 5.15.11 中也应该能正常工作。它首先设置了与暗色主题兼容的“Fusion”样式,然后定义了一个暗色调色板并将其应用到整个应用程序中。请注意,暗色调色板的颜色可以根据你的设计需求进行自定义。

此外,尽管 Qt 5 没有像 Qt 6 中那样的系统级暗色主题支持,但手动设置调色板是实现暗色主题的有效方法。

在 Qt 中,QApplication::setStyle(QStyleFactory::create("Fusion")) 这行代码用于设置应用程序的全局样式。Fusion 是 Qt 提供的一种内置样式。理解 Fusion 的最佳方式是将其看作是一个独立于平台的通用样式,它为应用程序提供了一种现代、干净且平滑的外观。

关于 Fusion 和其他可用样式的一些要点:

  1. Fusion 样式:这是 Qt 5 引入的一种风格,旨在为所有支持的平台提供一致的外观。这意味着无论应用程序运行在哪个操作系统上(如 Windows、MacOS、Linux),它都将拥有相同的视觉外观。

  2. 是否必须使用 Fusion:并不是必须使用 Fusion。Qt 支持多种内置样式,例如 WindowsWindowsVista(在 Windows 平台上)、Macintosh(在 MacOS 上)等。你可以根据应用程序的需要和目标用户群体的偏好选择合适的样式。

  3. 自定义样式:除了使用内置样式,你还可以创建自定义样式。这可以通过继承 QStyle 类并重写其方法来实现。

  4. 样式与平台一致性:如果你想让你的应用程序在不同平台上保持与原生应用程序一致的外观,你可能会选择不使用 Fusion 而是使用默认的样式(即不设置样式,让应用程序使用操作系统的默认样式)。

以下是设置样式的一个示例:

QApplication::setStyle(QStyleFactory::create("Windows")); // 设置为Windows样式

还原默认样式

要将应用程序的样式和调色板恢复为默认设置,你可以使用 Qt 提供的相关方法。在 Qt 中,默认的样式和调色板取决于你的操作系统和环境。以下是一个示例代码,展示了如何将样式和调色板重置为默认值:

#include <QApplication>
#include <QStyleFactory>
#include <QMainWindow>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 重置为默认样式
    QApplication::setStyle(QStyleFactory::create(""));

    // 重置为默认调色板
    app.setPalette(QApplication::style()->standardPalette());

    // 创建主窗口
    QMainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}

在这个示例中,我们首先通过将样式名称设置为一个空字符串来重置应用程序的样式。这会导致 Qt 使用平台默认的样式。接着,我们调用 QApplication::style()->standardPalette() 来获取当前样式的标准调色板,并将其设置为应用程序的调色板,从而恢复默认的调色板设置。

这样做可以将你的应用程序恢复到其初始的外观和风格,与操作系统的默认设置一致。这适用于 Qt 5 和 Qt 6。

参考链接
https://doc.qt.io/qt-6/gallery.html

posted @ 2024-01-18 18:05  非法关键字  阅读(807)  评论(0编辑  收藏  举报