以下是一个示例,它将耗时操作放在子线程中处理,并等待子线程完成后返回结果并更新UI:
#include <QtWidgets>
#include <QtCore>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
signals:
void resultReady(const QString &result);
public slots:
void doWork()
{
// Do some heavy work here...
QThread::sleep(3);
QString result = "Hello World from worker thread!";
emit resultReady(result);
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
setCentralWidget(new QLabel("Click the button to start processing..."));
QPushButton *button = new QPushButton("Start Processing", this);
connect(button, &QPushButton::clicked, this, &MainWindow::startProcessing);
}
private slots:
void startProcessing()
{
// Disable UI controls and show progress bar.
centralWidget()->setEnabled(false);
m_progressBar = new QProgressBar(this);
statusBar()->addWidget(m_progressBar);
// Create worker object and move it to a separate thread.
m_workerThread = new QThread(this);
Worker *worker = new Worker();
connect(worker, &Worker::resultReady, this, &MainWindow::handleResult);
// Move worker to a separate thread and start it.
worker->moveToThread(m_workerThread);
connect(m_workerThread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, m_workerThread, &QThread::quit);
// Wait for the worker thread to finish before cleaning up.
connect(m_workerThread, &QThread::finished, [this]() {
m_workerThread->deleteLater();
m_progressBar->deleteLater();
centralWidget()->setEnabled(true);
});
// Start the worker thread and show progress bar.
m_progressBar->setRange(0, 0);
m_workerThread->start();
}
void handleResult(const QString &result)
{
// Update UI with the result from worker thread.
QLabel *label = new QLabel(result, this);
setCentralWidget(label);
}
private:
QThread *m_workerThread;
QProgressBar *m_progressBar;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#include "main.moc"
在这个示例中,我们创建了一个名为Worker
的对象,它包含了执行耗时操作的函数。然后,我们在主线程中创建了一个名为MainWindow
的窗口,在该窗口中放置了一个按钮,用于启动处理过程。
当用户单击“Start Processing”按钮时,程序会禁用所有UI控件,并显示进度条。然后它将创建一个名为Worker
的对象,并将其移动到一个新线程中执行。接下来,程序会连接信号和槽以等待worker线程完成处理并返回结果。一旦收到结果,程序将更新UI并清理所有资源。
注意,在等待worker线程完成之前,我们使用了QCoreApplication::processEvents()函数来确保事件循环能够响应GUI事件(例如关闭窗口)。此外,在worker线程完成之后,我们需要手动删除worker线程和进度条对象。