What is the proper way to set QProgressBar to update from the logic layer?
Asked Answered
M

2

14

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

Macaco answered 9/1, 2013 at 7:28 Comment(0)
D
7
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();

}
Disloyalty answered 9/1, 2013 at 8:13 Comment(4)
So 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?Macaco
Exactly. (stackfill)Disloyalty
I'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.Gigantism
Send the signalProgress() from a worker thread and connect the signal with a Qt::QueuedConnection. I used this here: github.com/elsamuko/copymove2/blob/master/src/ui/….Disloyalty
W
5

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

Wiggly answered 9/1, 2013 at 7:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.