На Qt, как изменить значок действия на панели инструментов во время выполнения?

В программе, которая рассчитывает абсолютную точность чисел.
У меня есть действие на панели задач.

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? Есть идеи?

Благодарю.

1

Решение

Я бы создал подкласс 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()));
}
1

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

Я нашел решение, используя QToolButton вот:

Заголовок: FenPrincipale.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();
}
1

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