c++ - 以对象方式使用 QActions 改进现有代码

标签 c++ qt qaction

现有代码在 QToolbar 中实现了一些 QAction,如图所示。 目的是让选中的Qaction的图标闪烁。

因此,根据 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"; 
 }


}

最佳答案

如果需要制作向导,建议使用QWizard .

如果你需要让你的图标动起来,我建议使用 QMovie .

更新


您可以使用 QList<QAction*>保持你的行动,并保存最后触发的行动。这样做,当你的 Wizard_Step更改,您需要重置上一个 Action ,并设置当前 Action 。

QIcons 可以根据图标内部状态显示多个图像。因此您不需要更改图标,只需告诉图标状态已更改。

此代码段是一个工作示例,应该可以阐明这一点。我用了 QComboBox模拟对向导步骤的更改。您只需要连接到插槽 onWizardStepChanged更新图标。您不需要计时器来检查向导步骤是否已更改,而是发出一个信号表明向导步骤已更改(此处由组合框完成)。

主窗口.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

主窗口.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(){}

关于c++ - 以对象方式使用 QActions 改进现有代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31335959/

相关文章:

python - 如何在运行时更改工具栏中 Action 的图标?

c++ - 汇编中的指针/内存算法

c++ - 使用 resource.rc 中指定的不同语言构建应用程序

c++ - Qt QFrame成为独立窗口

qt - 在布局中使用 QSplitter

c++ - Qt - 创建图标按钮

c++ - QMenu 中 QActions 的 QTooltip

c++ - C++中 "resizing"数组访问冲突

c++ - 路径不对,怎么办?

c++ - 在 C++ 中实例化对象的正确方法是什么?