Qt应用不同的图标主题

Posted

技术标签:

【中文标题】Qt应用不同的图标主题【英文标题】:Qt application different icon theme 【发布时间】:2014-04-09 18:19:02 【问题描述】:

我使用 Java 和 QtJambi (Qt 4.6.3) 库开发了一个文本编辑器。该应用程序有一个 QToolBar,其中包含一些带有图标的 QAction。我的文本编辑器可以在两个主题(深色和浅色)之间切换。如果我使用黑色图标,深色主题看起来很糟糕,如果我使用白色图标,浅色主题看起来也很糟糕。当我按下切换主题按钮时,我想更改图标。

图标声明如下:

private String inir = "classpath:/ico/";
private QIcon iconodeshacer = new QIcon(inir+"deshacer.png");

我以这种方式将它们设置为 QActions:

private QToolBar herramientas = new QToolBar();
herramientas.addAction(iconodeshacer, "Deshacer", this, "deshacer()");

我已尝试更改 inir 字符串并应用:

herramientas.update();
herramientas.repaint();

我找不到 QtJambi 或常规 Qt 的解决方案(我可以从中翻译)。

我想声明两个图标主题并应用它们,而不必在配置之外声明每个 QAction 并使用 setIcon() 手动更改图标;

【问题讨论】:

【参考方案1】:

您可以实现switchTheme 函数并在每次要更改主题时调用它。在此功能中,您应该加载必要的图标。

class ActionManager : public QObject // Singleton

//...
QMap< QAction *, QString > allActions;

public:

  void registerAction( const QString& key, QAction *action )
  
    allActions[action] = key;
    connect( action, &QObject::destroyed, this, &ActionManager::onActionDelete );
  

  void switchTheme( const QString& themeName )
  
    for ( QMap< QAction *, QString >::iterator i = allActions.begin(); i != allActions.end(); i++ )
    
      const QString iconPath = QString( ":/icons/theme_%1/%2.ico").arg( themeName ).arg( i.value() );
      i.key()->setIcon( iconPath );
    
  

private slots:
  void onActionDelete()
  
    QAction *act = qobject_cast<QAction *>( sender() );
    allActions.remove( act );
  

;

//Usage:
QAction *saveAction = new QAction();
ActionManager::instance()->registerAction( act, "saveicon" );

//On applying theme:
ActionManager::instance()->switchTheme( "light ");
// Will load ":/icons/theme_light/saveicon.ico" for saveAction

【讨论】:

【参考方案2】:

感谢 Dmitry Sazonov 给我一个想法。由于我在 java 上编程,而不是 c++,它的代码很难应用于我的应用程序。但我理解了这个想法。我所做的是将图标名称存储在字符串数组中,并在每次切换主题时重置元素的图标。

private String[] nombreiconoseditar = "copiar.png", "cortar.png", "pegar.png", "", "deshacer.png", "rehacer.png", "", "buscar.png", "buscareemplazar.png";

我将路由更改为图标文件夹,并在我想要的元素中一一设置图标,在此示例中,我更改了 QMenu 编辑器上的所有图标。

inir="classpath:/ico/claro/";

List ed = editar.actions();
    for(int i=0; i<ed.size(); i++)
    
        QAction tmp = (QAction) ed.get(i);
        tmp.setIcon(new QPixmap(inir+nombreiconoseditar[i]));
    

希望这可以帮助遇到同样问题的人!

【讨论】:

以上是关于Qt应用不同的图标主题的主要内容,如果未能解决你的问题,请参考以下文章

如何在跳转开始列表和任务栏中为不同的主题显示不同的应用程序图标?

如何设置应用程序的任务栏图标在Windows 7-qt,windows-7,pyqt

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

Qt:有没有办法让工具栏图标适应系统主题?

Qt 应用程序图标设置问题

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