What is the proper way to set QProgressBar to update from the logic layer?
12,998
Solution 1
class LogicClass : public QObject
{
Q_OBJECT
public:
explicit LogicClass(QObject *parent = 0);
int max(){ return 100; }
int min(){ return 0; }
void emit50(){ emit signalProgress(50); }
signals:
void signalProgress(int);
public slots:
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
LogicClass logic;
ui->progressBar->setMaximum( logic.max() );
ui->progressBar->setMinimum( logic.min() );
connect( &logic, SIGNAL( signalProgress(int) ), ui->progressBar, SLOT( setValue(int) ) );
logic.emit50();
}
Solution 2
QProgressBar has some public slots that are used for setting min and max values and current value. Increasing the current value causes the progress bar to move. You can emit a signal from the logic layer that is connected to "void setValue ( int value )" slot of QProgressBar. http://doc.qt.digia.com/qt/qprogressbar.html
Related videos on Youtube
Author by
GoldenAxe
Updated on September 17, 2022Comments
-
GoldenAxe over 1 year
If I want to update a QProgressBar on the view layers from a loop on the logic layer (such as each iteration will update the progress bar), what is the proper way to do that?
Thanks
-
GoldenAxe over 11 yearsSo to update the progress bar in each iteration of a loop of some method in the logic class, I need to emit signalProgress(int) in each iteration?
-
elsamuko over 11 yearsExactly. (stackfill)
-
GTRONICK over 7 yearsI'm trying this, it updates the progress bar value correctly, but the main GUI freezes when you have a large process running. I have also tried
ui->progressBar->moveToThread(&workerThread)
, but does not work. How can I avoid GUI freezing? Thanks in advance. -
elsamuko over 7 yearsSend the
signalProgress()
from a worker thread and connect the signal with aQt::QueuedConnection
. I used this here: github.com/elsamuko/copymove2/blob/master/src/ui/….