目录
一、使用QThread类
(话不多说,直接上代码)
QtWidgetsApplication8.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication8.h"
#include<QThread> //引入线程头文件
#include<Qdebug>
class QtWidgetsApplication8 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication8(QWidget *parent = nullptr); //构造函数
~QtWidgetsApplication8(); //析构函数声明
private:
Ui::QtWidgetsApplication8Class ui;
};
class MyThread : public QThread // 创建 MyThread 类继承 QThread
{
public:
void run(); // 声明,重写run函数
};
main.cpp
#include "QtWidgetsApplication8.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication8 w;
// 获取主线程ID
qDebug()<<"主线程ID:"<<QThread::currentThreadId();
w.show();
return a.exec();
}
QtWidgetsApplication8.cpp
#include "QtWidgetsApplication8.h"
QtWidgetsApplication8::QtWidgetsApplication8(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
MyThread *thread = new MyThread; //创建线程
thread->start(); //启动线程
}
QtWidgetsApplication8::~QtWidgetsApplication8() //析构函数
{
}
void MyThread::run() //run函数的定义
{
// 获取子线程ID
qDebug() << "子线程ID:" << QThread::currentThreadId();
}
具体实现如图所示,运行后在控制台中打印主线程ID、子线程ID。
二、继承QObject
QtWidgetsApplication8.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication8.h"
#include<QThread>
#include<Qdebug>
class QtWidgetsApplication8 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication8(QWidget *parent = nullptr);
~QtWidgetsApplication8(); // 析构函数声明
private:
Ui::QtWidgetsApplication8Class ui;
};
class mythread2 :public QObject // 继承QObject
{
Q_OBJECT // 必须加
public:
void work(); // 线程函数
};
main.cpp
#include "QtWidgetsApplication8.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication8 w;
// 获取主线程ID
qDebug()<<"主线程ID:"<<QThread::currentThreadId();
w.show();
return a.exec();
}
QtWidgetsApplication8.cpp
#include "QtWidgetsApplication8.h"
QtWidgetsApplication8::QtWidgetsApplication8(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QThread *thread = new QThread(); //创建线程
mythread2 *st = new mythread2(); //创建对象
st->moveToThread(thread); //将对象移动到线程中
// 连接线程启动信号到work槽
connect(thread,&QThread::started,st,&mythread2::work);
thread->start(); //启动线程
}
QtWidgetsApplication8::~QtWidgetsApplication8() //析构函数
{
}
void mythread2::work()
{
qDebug() << "子线程ID:" << QThread::currentThreadId();
}
具体实现如图所示,运行后向控制台打印主线程ID、子线程ID
- 其中Q_OBJECT宏是必须加的,具体的可以去了解元对象编译器(Meta-Object Compiler,moc)
- moveToThread是Qt 中用于将对象移动到另一个线程的方法。通过调用 moveToThread() 函数,可以将一个 QObject 对象从当前线程移动到另一个线程中,从而实现对象在新线程中执行特定的任务。
三、其他
百度网盘链接: 提取码: ndcq
https://pan.baidu.com/s/12GrrFKyq-3BT8A8sxQGFcw?pwd=ndcq
下载后打开.sln工程文件即可