qt在多线程中如何子线程如何向主线程传参
时间: 2023-11-16 13:32:47 浏览: 227
Qt线程和主线程传递数据
在Qt中,子线程向主线程传递参数可以使用以下方式:
1. 使用信号与槽机制:在子线程中定义一个信号,主线程中定义一个槽函数,子线程通过emit发送信号并传递参数。
2. 使用QMetaObject::invokeMethod():在子线程中通过该方法调用主线程的槽函数,并传递参数。
下面是使用信号与槽机制的示例代码:
```cpp
// MyThread.h
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
signals:
void sendData(QString data);
protected:
void run() override;
};
// MyThread.cpp
#include "MyThread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
// 执行子线程任务
QString data = "Hello, World!"; // 子线程要传递的数据
emit sendData(data); // 发送信号并传递数据
}
// MainWindow.h
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_recvData(QString data);
private:
Ui::MainWindow *ui;
};
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_recvData(QString data)
{
qDebug() << "Received data from sub-thread: " << data;
}
void MainWindow::on_pushButton_clicked()
{
MyThread *thread = new MyThread(this);
connect(thread, &MyThread::sendData, this, &MainWindow::on_recvData); // 连接信号与槽函数
thread->start(); // 启动子线程
}
```
在上面的代码中,子线程通过emit发送sendData信号,并将数据作为参数传递进来,主线程通过connect连接了MyThread的sendData信号和MainWindow的on_recvData槽函数,当MyThread发送sendData信号时,主线程会自动调用on_recvData槽函数,并将数据作为参数传递进来。
阅读全文