0

既存のコードは、図のように QToolbar 内にいくつかの QAction を実装ます。目的は、選択した Qaction のアイコンを点滅させることです。

したがって、クラス メンバーであるWizard_Stepに従って、このタイマー ハンドラが呼び出されるたびに、専用のQActionのアイコンが交互に変更されます。

これは 100% 機能していますが、このコードは非常に大きく、オブジェクトの方法でこのコードを因数分解して改善したいと考えています。QActionポインター、配列などを使用するようなことを考えています。

QActions フォーム ツールバー

void MainWindow::on_Timer_Update()
{
  Wizard_hide = !Wizard_hide ;

  switch (Wizard_Step)
  {
  case 1 :
      if ( Wizard_hide )
       ui->actionOpen_Dir->setIcon(QIcon(QPixmap(":/Icons/dir_selected" ) ));
      else
        ui->actionOpen_Dir->setIcon(QIcon(QPixmap(":/Icons/dir") )) ;
      break;
  case 2 :
      if ( Wizard_hide )
       ui->actionAdd_Selected_Item->setIcon(QIcon(QPixmap(":/Icons/Selected_row_selected" ) ));
      else
        ui->actionAdd_Selected_Item->setIcon(QIcon(QPixmap(":/Icons/Selected_row") )) ;
      break;
  case 3 :
      if ( Wizard_hide )
       ui->actionClean_Filename->setIcon(QIcon(QPixmap(":/Icons/clean_selected" ) ));
      else
        ui->actionClean_Filename->setIcon(QIcon(QPixmap(":/Icons/clean") )) ;
      break;
  case 4 :
      if ( Wizard_hide )
       ui->actionApply_changes->setIcon(QIcon(QPixmap(":/Icons/Apply_selected" ) ));
      else
        ui->actionApply_changes->setIcon(QIcon(QPixmap(":/Icons/Apply") )) ;
      break;
      default: qDebug() << "error"; 
 }


}
4

2 に答える 2

1

ウィザードを作成する必要がある場合は、QWizardを使用することをお勧めします。

アイコンをアニメーション化する必要がある場合は、QMovieを使用することをお勧めします。

アップデート


を使用しQList<QAction*>てアクションを保持し、最後にトリガーされたアクションを保存できます。そうすることで、Wizard_Step変更時に最後のアクションをリセットし、現在のアクションを設定する必要があります。

QIcons は、アイコンの状態に応じて複数の画像を表示できます。したがって、アイコンを変更する必要はありませんが、アイコンの状態が変更されたことを伝えるだけです。

このスニペットは実用的な例であり、これを明確にする必要があります。を使用して、QComboBoxウィザード ステップへの変更をシミュレートしました。onWizardStepChangedアイコンを更新するには、スロットに接続するだけです。ウィザードのステップが変更されたかどうかを確認するためにタイマーは必要ありませんが、ウィザードのステップ変更されたというシグナルを発します (ここではコンボ ボックスによって行われます)。

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QList>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void onWizardStepChanged(int wizardStep);

private:

    int m_lastWizardStep;
    QList<QAction*> m_actionList;
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"

#include <QLabel>
#include <QDebug>
#include <QAction>
#include <QToolBar>
#include <QComboBox>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{

    QComboBox* combo = new QComboBox(this);
    QStringList wizardSteps;
    wizardSteps << "Action0" << "Action1";
    combo->addItems(wizardSteps);

    setCentralWidget(combo);

    // Create Icons, with different images per state
    QIcon iconAction0;
    iconAction0.addFile(":/images/images/unchecked.png", QSize(), QIcon::Normal, QIcon::Off);
    iconAction0.addFile(":/images/images/checked.png", QSize(), QIcon::Normal, QIcon::On);

    QIcon iconAction1;
    iconAction1.addFile(":/images/images/unchecked.png", QSize(), QIcon::Normal, QIcon::Off);
    iconAction1.addFile(":/images/images/checked.png", QSize(), QIcon::Normal, QIcon::On);


    // Create Actions
    QAction* action0 = new QAction(iconAction0, "Action0", this);
    action0->setCheckable(true);

    QAction* action1 = new QAction(iconAction1, "Action1", this);
    action1->setCheckable(true);

    // Store actions in list
    m_actionList.append(action0);
    m_actionList.append(action1);

    // Add actions to toolabar
    QToolBar* toolBar = addToolBar("Actions");
    toolBar->addAction(action0);
    toolBar->addAction(action1);


    // Connect ComboBox
    connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(onWizardStepChanged(int)));

    // Set action0 as default
    m_lastWizardStep = 0;
    action0->setChecked(true);
    combo->setCurrentIndex(m_lastWizardStep); // combo->currentIndex = 0 by default
}

void MainWindow::onWizardStepChanged(int wizardStep)
{
    if(m_lastWizardStep != wizardStep)
    {
        m_actionList.at(m_lastWizardStep)->setChecked(false);
        m_actionList.at(wizardStep)->setChecked(true);
        m_lastWizardStep = wizardStep;
    }
}


MainWindow::~MainWindow(){}
于 2015-07-10T11:41:31.250 に答える
0

QStateMachineあなたのプロパティをバインドするために使用できます。ドキュメントによると、クラスQActionにはiconプロパティがあります。

したがって、必要QStateなプロパティをバインドする 2 つの を作成し、これらの状態をに追加してQStateMachine開始する必要があります。

使用_State Machine Framework

于 2015-07-10T08:39:07.530 に答える