Qt中使用多线程是通过connect关联信号和槽来实现子线程与主线程之间的数据传递与页面数据展示的,详细请看下面实例:
下面三行代码是实现主线程与子线程通信的信号连接。
//子线程运行了RUN()中的retrun之后会发出finished信号,来执行子线程中QObject::deleteLater方法
connect(&workerThread1, &QThread::finished, worker, &QObject::deleteLater);
//主线程发射信号子线程执行槽函数用于在子线程中进行处理运算
connect(this, &MainWindow::operate, worker, &Worker::doWork);
//子线程发射信号主线程执行槽函数用于在主线程中返回执行结果
connect(worker, &Worker::resultReady, this, &MainWindow::handleResults);
mainwindow.cpp:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QDateTime> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //子线程1 Worker *worker = new Worker; worker->moveToThread(&workerThread1); connect(&workerThread1, &QThread::finished, worker, &QObject::deleteLater); connect(this, &MainWindow::operate, worker, &Worker::doWork); connect(worker, &Worker::resultReady, this, &MainWindow::handleResults); workerThread1.start(); //子线程2 Worker *worker2 = new Worker; worker2->moveToThread(&workerThread2); connect(&workerThread2, &QThread::finished, worker2, &QObject::deleteLater); connect(this, &MainWindow::operate2, worker2, &Worker::doWork2);//关联主线程与子线程的信号和槽 connect(worker2, &Worker::resultReady2, this, &MainWindow::handleResults2);//关联子线程与主线程的信号和槽 workerThread2.start(); } MainWindow::~MainWindow() { delete ui; workerThread1.quit(); workerThread1.wait(); workerThread2.quit(); workerThread2.wait(); } void MainWindow::handleResults(const QString &str) { ui->lineEdit->setText(str); qDebug()<<"MainWindow::handleResults收到的内容是:"<<str<<endl; } void MainWindow::handleResults2(const QString &str) { ui->lineEdit_2->setText(str); qDebug()<<"MainWindow::handleResults2收到的内容是:"<<str<<endl; } void Worker::doWork(const QString &str) { qDebug()<<"收到的内容是:"<<str<<endl; emit resultReady(str);//在子线程中发射信号,驱动主线程的槽函数 } void Worker::doWork2(const QString &str) { qDebug()<<"收到的内容是:"<<str<<endl; emit resultReady2(str);//在子线程中发射信号,驱动主线程的槽函数 } void MainWindow::on_pushButton_clicked() { emit operate(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")+"进程1发射了信号!");//在主线程中发射信号,驱动子线程的槽函数,在子线程中做大量逻辑处理 emit operate2(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")+"进程2发射了信号!");//在主线程中发射信号,驱动子线程的槽函数,在子线程中做大量逻辑处理 }
mainwindow.h:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QThread> #include <QObject> #include <QThread> class Worker : public QObject { Q_OBJECT public slots: void doWork(const QString &str); void doWork2(const QString &str); signals: void resultReady(const QString &result); void resultReady2(const QString &result); }; QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT QThread workerThread1; QThread workerThread2; public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); void handleResults(const QString &str); void handleResults2(const QString &str); signals: void operate(const QString &str); void operate2(const QString &str); private: Ui::MainWindow *ui; }; #endif
main.cpp
复制代码
1
2
3
4
5
6
7
8
9
10
11
12#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
秋风写于淄博,业务联系与技术交流:Q375172665
最后
以上就是满意钢笔最近收集整理的关于Qt中使用多线程并返回结果到主线程的例子的全部内容,更多相关Qt中使用多线程并返回结果到主线程内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复