在Qt上,如何在运行时更改工具栏中操作的图标

On Qt, how to change the icon of an action in the toolbar at runtime?

本文关键字:工具栏 操作 图标 运行时 Qt      更新时间:2023-10-16

在计算精度数的程序中。我在任务栏上有一个操作。

QAction* button_stop_continue.

我在程序开头设置了图标绿色图标,当执行计算时,它应该变成红色,依此类推。

我已经尝试过这样的事情:

connect(this, SIGNAL(startedComputing()), this, SLOT(turnIconRed()));
connect(this, SIGNAL(finishedComputing()), this, SLOT(turnIconGreen()));

函数 turnIconRed 看起来像这样:

void turnIconRed()
{
    button_stop_continue->setIcon(QIcon("images/red-light.png"));
}

我想出了一些令人难以置信的丑陋算法:S.在Qt上没有一种直接的方法来处理这个问题吗?有什么想法吗?

谢谢。

我会对QAction进行子类化,并为它可以处于的状态添加一些逻辑。将某些内容的颜色硬编码到方法的名称中从来都不是一个好主意。通过子类化 QAction,它的外观和感觉被封装了。

这可能是这样的:

头文件:

class StateAction : public QAction
{
    Q_OBJECT
public:
    explicit StateAction(QObject *parent = 0);
public slots:
    void start();
    void stop();
    void pause();
};

实现文件:

StateAction::StateAction(QObject *parent) :
    QAction(parent)
{
    this->stop();
}
void StateAction::start()
{
    this->setIcon(QIcon(":/states/start.png"));
}
void StateAction::stop()
{
    this->setIcon(QIcon(":/states/stop.png"));
}
void StateAction::pause()
{
    this->setIcon(QIcon(":/states/pause.png"));
}

现在,在您的 MainWindow 中,您只需将其插槽连接到正确的信号即可使用该自定义 QAction:

头文件:

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
signals:
    void startedComputing();
    void finishedComputing();
    void pausedComputing();
private:
    void createActions();
    void createToolbars();
    void createConnections();
    StateAction *m_stateAction;
};

实现文件:

void MainWindow::createConnections()
{
    connect(this, SIGNAL(startedComputing()), m_stateAction, SLOT(start()));
    connect(this, SIGNAL(finishedComputing()), m_stateAction, SLOT(stop()));
    connect(this, SIGNAL(pausedComputing()), m_stateAction, SLOT(pause()));
}

我在这里找到了使用 QToolButton 的解决方案:

标题 : 芬校长.h

#ifndef FENPRINCIPALE_H
#define FENPRINCIPALE_H
#include <QWidget>
#include <QVBoxLayout>
#include <QToolButton>
#include <QToolBar>
#include <QAction>
#include <QTextEdit>
class FenPrincipale : public QWidget {
    Q_OBJECT
public:
    FenPrincipale();
private slots:
    void goComputing();
    void stopComputing();
private:
    QAction* actionDemarrer;    // Start computing
    QAction* actionArreter;     // Stop computing
    QToolBar* toolBarActions;
    QToolButton* boutonAction;  // this button holds the appropriate action
    QVBoxLayout* layoutPrincipale;
    QTextEdit* resultat;        // show result
};

实施:FenPrincipale.cpp

#include "FenPrincipale.h"
FenPrincipale::FenPrincipale() : QWidget()
{
    this->setFixedSize(400, 200);
    // create actions
    actionDemarrer = new QAction(QIcon("bouton-vert.png"), "demarrer", this);
    actionArreter = new QAction(QIcon("bouton-rouge.png"), "arreter", this);
    boutonAction = new QToolButton;
    boutonAction->setDefaultAction(actionDemarrer);
    // create toolbar
    toolBarActions = new QToolBar(this);
    toolBarActions->addWidget(boutonAction);
    // create result widget
    resultat = new QTextEdit(this);
    // create layout
    layoutPrincipale = new QVBoxLayout(this);
    layoutPrincipale->addWidget(toolBarActions);
    layoutPrincipale->addWidget(resultat);
    this->setLayout(layoutPrincipale);

    // make connections
    QObject::connect(actionDemarrer, SIGNAL(triggered()), this, SLOT(goComputing()));
    QObject::connect(actionArreter, SIGNAL(triggered()), this, SLOT(stopComputing()));
}
void FenPrincipale::goComputing()
{
    resultat->setText("Computing...");
    boutonAction->setDefaultAction(actionArreter);
}
void FenPrincipale::stopComputing()
{
    resultat->setText("Partial result : {?}");
    boutonAction->setDefaultAction(actionDemarrer);
}

主要

#include <QApplication>
#include "FenPrincipale.h"
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    FenPrincipale fenetre;
    fenetre.show();
    return app.exec();
}