程序运行Qt期间对话框窗口冻结

时间:2019-01-12 16:46:13

标签: qt

我正在Qt中编写一个执行某种算法的程序,我想 对话框窗口上的进度条可根据迭代次数成比例地更改。 问题是运行算法时对话框窗口没有响应。 当算法结束并显示实心条时,它只是解冻。 我将在算法循环开始时将进度条更新为期望值。

1 个答案:

答案 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