我使用Java和QtJambi(Qt 4.6.3)库开发了一个文本编辑器。该应用程序有一个QToolBar,带有一些带图标的QActions。我的文本编辑器可以在两个主题(黑暗和浅色)之间切换。如果我使用黑色图标,黑暗主题看起来很糟糕,如果我使用白色图标,灯光主题看起来也很糟糕。我想在按下开关主题按钮时更改图标。
图标声明如下:
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()手动更改图标;
答案 0 :(得分: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
答案 1 :(得分:0)
感谢德米特里·萨佐诺夫给我一个想法。由于我在java上编程而不是c ++,因此其代码难以应用于我的应用程序。但我理解这个想法。我已经完成了将图标名称存储在String数组上并在每次切换主题时重置元素的图标。
private String[] nombreiconoseditar = {"copiar.png", "cortar.png", "pegar.png", "", "deshacer.png", "rehacer.png", "", "buscar.png", "buscareemplazar.png"};
然后我将路径更改为icon文件夹并在我想要的元素中逐个设置图标,在本例中,我更改了QMenu editar上的所有图标。
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]));
}
希望这可以帮助有同样问题的人!