VS2022+QT6.7.2 子线程与主线程通信(详细)(注释)

需求:主线程将需要计算的数据发送给子线程,子线程将计算后的结果返回给主线程。

实现逻辑:(前提:子线程类已创建好,并使用start方法启动子线程)

1、主线程的mysignal1信号触发子线程的myslot2槽函数

方法:connect(this, &QtWidgetsApplication13::mysignal1, st, &mythread::myslot2); 

2、子线程的myslot2槽函数中的mysignal2信号触发主线程的myslot1槽函数

方法: connect(st,&mythread::mysignal2,this,&QtWidgetsApplication13::myslot1);

具体实现如下:

#include "QtWidgetsApplication13.h"

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication13.h"
#include<QThread> //线程类
#include<QDebug>  //调试
#include<QString>  //字符串类

class QtWidgetsApplication13 : public QMainWindow //主窗口类,主线程
{
    Q_OBJECT  // 宏,必须

public:
    QtWidgetsApplication13(QWidget *parent = nullptr); //构造函数
    ~QtWidgetsApplication13();  //析构函数

public slots:
        void myslot1(QString);  //槽函数

signals:
        void mysignal1(QString); //信号

private:
    Ui::QtWidgetsApplication13Class ui; //ui
};

class mythread : public QObject //子线程类
{
    Q_OBJECT // 宏,必须

public slots:
    void myslot2(QString); //槽函数

signals:
    void mysignal2(QString);  //信号
};

#include "QtWidgetsApplication13.cpp"

#include "QtWidgetsApplication13.h"

QtWidgetsApplication13::QtWidgetsApplication13(QWidget *parent)
    : QMainWindow(parent)
{   ui.setupUi(this);
    QThread *thread = new QThread(); //创建线程对象
    mythread *st= new mythread(); //创建工作对象
    st->moveToThread(thread); //将工作对象移动到线程
    thread->start(); //启动子线程,mysignal1信号手动触发线程开始执行

    //主线程中信号触发线程启动,执行子线程的myslot2槽
    connect(this, &QtWidgetsApplication13::mysignal1, st, &mythread::myslot2); 
    
    //子线程myslot2槽函数中触发mysignal2信号,执行主线程的myslot1槽
    connect(st,&mythread::mysignal2,this,&QtWidgetsApplication13::myslot1);

    //点击pushButton启动线程,并发送信号
    connect(ui.pushButton, &QPushButton::clicked, this, [=]() { 
        mysignal1("10000");  //给子线程发送信号“10000”
        });
}

void mythread::myslot2(QString str) //子线程的槽函数
{
    int i=0,a; //定义变量
    a=str.toInt(); //将QString转换为int
    qDebug()<<"子线程ID"<<QThread::currentThreadId();
    while(i<a) //循环10000次
    {
        str=QString::number(i); //将int转换为QString
        i++; //自增
        emit mysignal2(str); //发送信号
        QThread::msleep(30); //休眠30ms
    }
}

void QtWidgetsApplication13::myslot1(QString str) //主线程的槽函数
{
    ui.textEdit->append(str); //向textEdit输出
}

QtWidgetsApplication13::~QtWidgetsApplication13() //析构函数
{ 
}



#include "main.cpp"

#include "QtWidgetsApplication13.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtWidgetsApplication13 w;
    qDebug() << "主线程ID" << QThread::currentThreadId();
    w.show();
    return a.exec();
}

具体实现效果如下:

ui中拖入一个pushbutton按钮,TextEdit文本列表框

  • 42
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值