2015-07-10 39 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

相關問題