以对象方式使用 QActions 改进现有代码
Improve existing code using QActions in an object way
现有代码在 QToolbar 中实现了一些 QAction,如图所示。
目的是让选中的Qaction的图标闪烁。
因此,根据 Wizard_Step - class 成员 - 专用 每次调用此计时器处理程序时,QAction 都会交替更改其图标。
虽然这是 100% 的工作,但这段代码真的很庞大,我想通过以对象方式分解这段代码来改进。我正在考虑使用 QAction 指针,例如数组。
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";
}
}
你可以用QStateMachine
for binding yours property. As documentation说QAction
class有icon
属性。
因此您需要创建两个 QState
,绑定必要的属性,将这些状态添加到您的 QStateMachine
中并启动它。
一些examples of using State Machine Framework
如果需要制作精灵,建议使用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(){}
现有代码在 QToolbar 中实现了一些 QAction,如图所示。 目的是让选中的Qaction的图标闪烁。
因此,根据 Wizard_Step - class 成员 - 专用 每次调用此计时器处理程序时,QAction 都会交替更改其图标。
虽然这是 100% 的工作,但这段代码真的很庞大,我想通过以对象方式分解这段代码来改进。我正在考虑使用 QAction 指针,例如数组。
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";
}
}
你可以用QStateMachine
for binding yours property. As documentation说QAction
class有icon
属性。
因此您需要创建两个 QState
,绑定必要的属性,将这些状态添加到您的 QStateMachine
中并启动它。
一些examples of using State Machine Framework
如果需要制作精灵,建议使用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(){}