Qt 线程与线程之间数据传递

有时候我们需要不同的线程之间进行数据的传送,使得数据合并,达到完成的数据,这里简单记录下线程之间的传递。基本思想通过槽函数也让线程1与线程2绑定发送数据与接受数据函数。

创建一个QT Widgets工程,添加两个线程类。OneThread,与  twoThread

onethread.h

#ifndef ONETHREAD_H
#define ONETHREAD_H

#include <QObject>
#include <QThread>

class OneThread : public QThread
{
    Q_OBJECT
public:
    OneThread();
    void send(int data);

signals:
     void sendData(int data);
public slots:

};

#endif // ONETHREAD_H

onethread.cpp

#include "onethread.h"

OneThread::OneThread()
{

}

void OneThread::send(int data)
{
    emit sendData(data);
}

twothread.h

#ifndef TWOTHREAD_H
#define TWOTHREAD_H

#include <QObject>
#include <QThread>
class twoThread : public QThread
{
    Q_OBJECT
public:
    twoThread();

    void getData(int getData);

signals:

public slots:
    
};

#endif // TWOTHREAD_H

twothread.cpp

#include "twothread.h"
#include <QDebug>
twoThread::twoThread()
{

}

void twoThread::getData(int getData)
{
    qDebug() << getData << endl;
}

 界面如下图:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "onethread.h"
#include "twothread.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();

private:
    OneThread *oneThd;
    twoThread *twoThd;
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    oneThd = new OneThread();
    twoThd = new twoThread();
    connect(oneThd,&OneThread::sendData,twoThd,&twoThread::getData);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    oneThd->send(12);
}

运行结果:

点击按钮后,线程2收到了数据。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Qt线程之间传递参数需要借助于信号与机制。以下是具体步骤: 1. 创建一个自定义信号,该信号需要带有需要传递的参数。 2. 在需要传递参数的线程中,将该信号连接至一个函数。 3. 在该线程中,当需要传递参数时,通过emit语句触发该信号,并将参数传递给信号。 4. 在接收参数的线程中,将该信号连接至一个函数。 5. 在接收参数的函数中,获取信号所带的参数。 下面是一个示例代码: ``` // MyThread.h class MyThread : public QThread { Q_OBJECT signals: void mySignal(int arg); public: void run(); }; // MyObject.h class MyObject : public QObject { Q_OBJECT public slots: void mySlot(int arg); }; // MyThread.cpp void MyThread::run() { // ... emit mySignal(123); // ... } // MyObject.cpp void MyObject::mySlot(int arg) { // Do something with arg } // In main() MyThread thread; MyObject obj; QObject::connect(&thread, &MyThread::mySignal, &obj, &MyObject::mySlot); ``` 在上面的示例中,MyThread线程通过mySignal信号传递了一个int类型的参数123,MyObject通过mySlot函数接收该参数。注意,在连接信号和函数时,需要使用QObject::connect函数,将信号与函数关联起来。 ### 回答2: 在Qt中,线程之间的参数传递可以通过信号和机制来实现。 首先,在发送信号的线程中,定义一个信号函数,并在函数参数中传递需要传递的参数。例如: ```cpp signals: void sendData(int param1, QString param2); ``` 然后,在接收信号的线程中,定义一个函数来接收信号传递的参数。例如: ```cpp public slots: void receiveData(int param1, QString param2); ``` 接下来,在发送信号的地方调用信号函数,并传入参数: ```cpp emit sendData(123, "Hello World"); ``` 最后,在接收信号的地方连接信号和,并处理接收到的参数: ```cpp connect(sender, SIGNAL(sendData(int, QString)), receiver, SLOT(receiveData(int, QString))); ``` 当信号被触发后,接收信号的线程将会调用相应的函数,并传入参数。 除了信号和机制,Qt还提供了其他方法来实现线程之间的参数传递,比如通过共享对象或者全局变量来进行数据传递。但是这些方法可能需要考虑线程安全性的问题,所以在使用时要谨慎,并确保数据传递的正确性和可靠性。 ### 回答3: 在Qt中,线程之间可以通过信号与机制来传递参数。首先,定义一个自定义的信号,可以包含参数。接下来,在需要传递参数的线程中,将参数通过信号发送出去。然后在接收参数的线程中,连接信号与,并在函数中获取传递的参数。 例如,在一个线程中需要将一个整型参数传递给另一个线程: ```cpp // 定义一个自定义的信号,包含一个整型参数 class MyThread : public QThread { Q_OBJECT public: // 自定义信号 signals: void mySignal(int value); }; // 发送参数的线程 void MyThread::run() { // 发送参数 emit mySignal(123); } // 接收参数的线程 class AnotherThread : public QThread { Q_OBJECT public slots: // 函数,用于接收参数 void onMySignal(int value) { qDebug() << "Received value: " << value; } }; // 在main函数中创建线程对象,并连接信号与 int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyThread t1; AnotherThread t2; // 连接信号与 QObject::connect(&t1, SIGNAL(mySignal(int)), &t2, SLOT(onMySignal(int))); // 启动线程 t1.start(); t2.start(); return a.exec(); } ``` 在上面的例子中,MyThread线程通过emit mySignal(123)发射了一个信号,AnotherThread线程通过QObject::connect连接了mySignal信号与onMySignal函数,并在函数中获取了传递的参数123。 总结起来,Qt线程之间通过信号与机制来传递参数,只需要定义自定义信号、发送信号、连接信号与,并在函数中获取参数即可完成线程间的参数传递
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值