1

Java と QtJambi (Qt 4.6.3) ライブラリを使用してテキスト エディターを開発しました。アプリケーションには、アイコン付きの QActions を含む QToolBar があります。私のテキスト エディターは、2 つのテーマ (ダークとライト) を切り替えることができます。黒いアイコンを使うと暗いテーマがひどく見え、白いアイコンを使うと明るいテーマもひどいように見えます。テーマ切り替えボタンを押したときのアイコンを変更したい。

アイコンは次のように宣言されます。

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 String を変更して適用しようとしました:

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

QtJambi または通常の Qt (そこから翻訳できます) の解決策が見つかりません。

両方のアイコン テーマを宣言し、構成外で各 QAction を宣言して手動で setIcon(); を使用してアイコンを変更することなく、それらを適用したいと思います。

4

2 に答える 2

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
于 2014-04-10T10:14:15.993 に答える