实现思路:第一步需要将子线程声明为主线程的友元类,第二步是将主线程类对象的地址通过信号槽传递给子线程中创建的对象,使得子线程能访问主线程的数据的
1、子线程
displayresult.h //头文件
//伪代码
#include"tabwindow.h"//包含主线程头文件
public:
void closeThread();
public slots:
void startThreadSlot();
private slots:
void getaddress(TabWindow *);
private:
volatile bool isStop;
TabWindow *t;
displayresult.cpp //代码文件
isStop = false;
void DisplayResult::closeThread()
{
isStop = true;
}
void DisplayResult::startThreadSlot()
{
qDebug()<<"执行子线程";
}
void DisplayResult::getaddress(TabWindow *p)
{
t = p;
}
2、主线程
tabwindow.h //头文件
//伪代码
#include <QVBoxLayout>
#include <QThread>
#include "displayresult.h"
class DisplayResult;//前置声明
signals:
void preperDisplay(TabWindow *);
public:
friend class DisplayResult;
private slots:
void closeThreadSlot();
void finishedThreadSlot();
private:
QVBoxLayout *mainLayout;
QThread *firstThread;
DisplayResult *myObjectThread;
tabwindow.cpp //代码文件
#include "displayresult.h"
firstThread = new QThread; //线程容器,创建子线程
myObjectThread = new DisplayResult();//创建自定义线程类
myObjectThread->moveToThread(firstThread); //将创建的对象移到线程容器中
connect(firstThread,SIGNAL(finished()),myObjectThread,SLOT(deleteLater())); //终止线程时要调用deleteLater槽函数
connect(firstThread,SIGNAL(started()),myObjectThread,SLOT(startThreadSlot())); //开启线程槽函数
connect(firstThread,SIGNAL(finished()),this,SLOT(finishedThreadSlot()));
firstThread->start(); //开启子线程槽函数
connect(this,SIGNAL(preperDisplay(TabWindow *)),myObjectThread,SLOT(getaddress(TabWindow *)));
emit preperDisplay(this);
void TabWindow::closeThreadSlot()
{
qDebug()<<tr("关闭线程");
if(firstThread->isRunning())
{
myObjectThread->closeThread(); //关闭线程槽函数
firstThread->quit(); //退出事件循环
firstThread->wait(); //释放线程槽函数资源
}
}
void TabWindow::finishedThreadSlot()
{
qDebug()<<tr("多线程触发了finished信号");
}