2015-07-10 37 views
0

如图所示,现有代码在QToolbar内实现了一些QAction。 目的是让选定的Qaction图标闪烁。使用QActions以对象方式改进现有代码

因此,根据Wizard_Step - 一类成员 - 专用的QAction具有其图标交替改变每个该定时器的处理程序被调用时。

虽然这是100%的工作,这段代码真的很难受,我想通过以对象方式分解此代码来改善。我正在考虑像使用QAction指针,例如数组。

QActions form toolbar

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"; 
} 


} 

回答

1

如果你需要一个向导,我建议使用QWizard

如果你需要让你的图标变成动画,我建议使用QMovie

UPDATE


可以使用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(){} 
+0

虽然我知道这2点的,@dlewin你想让它_blink_他们不对应我的需求 – dlewin

+0

?或_toggle_从选中到未选中? – Miki

+0

@dlewin检查我的更新答案是否有用 – Miki

相关问题