Улучшение существующего кода с использованием QActions объектным способом

Существующий код реализует некоторые QActionв пределах QToolbar как на картинке.
Цель состоит в том, чтобы сделать значок выбранного 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";
}}

0

Решение

Если вам нужно сделать мастера, я предлагаю использовать 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(){}
1

Другие решения

Ты можешь использовать QStateMachine для привязки вашей собственности. Как документация сказать QAction класс имеет icon имущество.

Так что вам нужно создать два QState, обязательные свойства, добавьте эти состояния в свой QStateMachine и начать это.

Немного Примеры использования State Machine Framework

0

По вопросам рекламы [email protected]