我正在Qt中编写一个执行某种算法的程序,我想 对话框窗口上的进度条可根据迭代次数成比例地更改。 问题是运行算法时对话框窗口没有响应。 当算法结束并显示实心条时,它只是解冻。 我将在算法循环开始时将进度条更新为期望值。
答案 0 :(得分:1)
“正确”的方法是创建另一个线程,该线程将通过信号/插槽连接到您的MainWindow以更新进度条。例如,线程可能会发出带有整数的信号,并且进度百分比已完成到主窗口中的某个插槽,该插槽会将进度条设置为该int。 http://doc.qt.io/qt-5/thread-basics.html
// main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QThread>
#include <QDebug>
class Thread : public QThread
{
Q_OBJECT
signals:
void progress( int value );
private:
void run()
{
for(int i = 0; i <= 100; i++ )
{
emit progress( i );
QThread::sleep(1);
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
qDebug()<<"From main thread: "<<QThread::currentThreadId();
Thread t;
QObject::connect(&t, SIGNAL(finished()), &a, SLOT(quit()));
QObject::connect(&t, SIGNAL(progress(int)), &w, SLOT(onProgress(int)));
t.start();
return a.exec();
}
// mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow( QWidget * parent );
~MainWindow();
public slots:
void onProgress( int i );
};
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onProgress( int i )
{
ui->progressBar->setValue(i);
}
或者...一种解决方法是调用QCoreApplication :: processEvents();。有时主GUI会“跟上”。 http://doc.qt.io/qt-5/qcoreapplication.html#processEvents