需求:主线程将需要计算的数据发送给子线程,子线程将计算后的结果返回给主线程。
实现逻辑:(前提:子线程类已创建好,并使用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文本列表框
标签:QT6.7,myslot2,mythread,线程,VS2022,QtWidgetsApplication13,include,QString From: https://blog.csdn.net/ZJQSDSA/article/details/141023582