如何在 Qt C++ 中根据主题更改图标?如果可用的主题是深色或浅色

Posted

技术标签:

【中文标题】如何在 Qt C++ 中根据主题更改图标?如果可用的主题是深色或浅色【英文标题】:How to change icons based on theme in Qt C++? If available themes are dark or light 【发布时间】:2014-11-08 08:40:23 【问题描述】:

我有一个基于 Qt 的文本编辑器程序。它的默认主题是黑暗的。我想添加一个功能,当用户为 switchtheme() 选择 QAction 时,主题应该切换为亮,图标也应该根据亮/暗而变化。在我的 qrc 文件中,我设置了如下结构

:/images
|--> /theme_dark/
|--> /theme_light/ 

两个目录中的图标文件名保持相同。

void MainWindow::switchTheme(const QString &themeName) 

//themeName will be "light" or "dark"

    QString image_path = ":/images/theme_"+themeName+"/"; 

    //Now maybe we can create a QStringList and append(filenames) to it.
    //Find all QActions in the toolbar and setIcon()?

问题是深色图标在深色主题上看起来不太好,而浅色图标在浅色主题上看起来不太好。我想知道如何以有效的方式做到这一点。

【问题讨论】:

【参考方案1】:

你可以使用QFileSelector:

QFileSelector selector;
QStringList extraSelectors;
extraSelectors << "theme_dark";
selector.setExtraSelectors(extraSelectors);
QString image = selector.select(":/images/myImage.png");

Qrc文件结构应该是:

:/images
|--> /+theme_dark/
|-----> myImage.png
|--> /+theme_light/
|-----> myImage.png

【讨论】:

其实在images/目录里面,有工具栏的图标。所以我必须单独设置QAction *act = qobject_cast&lt;QAction*&gt;(ui-&gt;action_Name); act-&gt;setIcon(QIcon(image_path+"image.png")); 有没有更快的方法呢?也许设置图像名称和动作名称会有所帮助?例如,在文本编辑器中有工具栏按钮,当切换主题时,所有工具按钮也应该改变颜色。 @Bhavyanshu 您可以使用 myToolbar->actions() 获取所有操作。然后遍历 QList 并设置图标:setIcon(QIcon(selector.select(":/images/"+actionsList.at(0).title+".png")))。在这种情况下,图像名称必须与动作标题相同。切换主题时,您应该更改 extraSelectors 并重置所有图标。

以上是关于如何在 Qt C++ 中根据主题更改图标?如果可用的主题是深色或浅色的主要内容,如果未能解决你的问题,请参考以下文章

如何根据设置的主题更改颤动中的状态栏图标和文本颜色?

WP7:了解暗/亮图标以及如何根据它们动态更改(通过mvvmlight)?

(Qt C++) QPushButton setIcon() 不工作

如何从 C++/Qt 中的 .exe 和 .dlls 中读取图标(在 Windows 上)?

如何根据主题更改状态栏/导航栏颜色/亮度?

如何使用 QPushButton 的系统主题图标——Linux 上的 Qt Designer