QT开发中文网

qt中gui线程将耗时操作放到子线程处理,并等待子线程处理完返回,并且药响应事件循环的例子

以下是一个示例,它将耗时操作放在子线程中处理,并等待子线程完成后返回结果并更新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线程和进度条对象。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2676

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?