千家信息网

Qt5.9如何继承QObject创建多线程

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇文章给大家分享的是有关Qt5.9如何继承QObject创建多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。利用继承QObject
千家信息网最后更新 2025年11月07日Qt5.9如何继承QObject创建多线程

本篇文章给大家分享的是有关Qt5.9如何继承QObject创建多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

利用继承QObject方法创建多线程,主要的步骤有一下几点:(注意:退出线程循环后,还要调用QThread::quit()函数,该线程才会触发QThread::finished()信号)

a1:首先创建一个类MyThread,基类为QObject。

a2:在类MyThread中创建一个槽函数,用于运行多线程里面的代码。所有耗时代码,全部在这个槽函数里面运行。

a3:实例一个QThread线程对象(容器),将类MyThread的实例对象转到该容器中,用函数void QObject::moveToThread(QThread *thread);

myObjectThread->moveToThread(firstThread);

a4:用一个信号触发该多线程槽函数,比如用QThread::started()信号。

connect(firstThread,SIGNAL(started()),myObjectThread,SLOT(startThreadSlot()));

a5:用信号QThread::finished绑定槽函数QThread::deleteLatater(),在线程退出时,销毁该线程和相关资源。

connect(firstThread,SIGNAL(finished()),firstThread,SLOT(deleteLater()));

a6:所有线程初始化完成后,启动函数QThread::start()开启多线程,然后自动触发多线程启动信号QThread::started()。

具体的教程如下图所示:

1.1新建一个widget工程,不要勾选ui界面。然后分别在mythread.h,mythread.cpp,widget.h,widget.cpp,main.cpp分别添加如下代码。

mythread.h

#ifndef MYTHREAD_H#define MYTHREAD_H #include  class MyThread : public QObject{    Q_OBJECTpublic:    explicit MyThread(QObject *parent = nullptr);     void closeThread(); signals: public slots:    void startThreadSlot(); private:    volatile bool isStop;}; #endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"#include #include  MyThread::MyThread(QObject *parent) : QObject(parent){    isStop = false;} void MyThread::closeThread(){    isStop = true;} void MyThread::startThreadSlot(){    while (1)    {        if(isStop)            return;        qDebug()<<"MyThread::startThreadSlot QThread::currentThreadId()=="<

widget.h

#ifndef WIDGET_H#define WIDGET_H #include #include #include #include #include "mythread.h" class Widget : public QWidget{    Q_OBJECT public:    Widget(QWidget *parent = 0);    ~Widget();     void createView(); private slots:    void openThreadSlot();    void closeThreadSlot();    void finishedThreadSlot(); private:    QVBoxLayout *mainLayout;    QThread *firstThread;    MyThread *myObjectThread;}; #endif // WIDGET_H

widget.cpp

#include #include "widget.h" Widget::Widget(QWidget *parent)    : QWidget(parent){    createView();} Widget::~Widget(){} void Widget::createView(){    /*UI界面*/    mainLayout = new QVBoxLayout(this);    QPushButton *openThreadBtn = new QPushButton(tr("打开线程"));    QPushButton *closeThreadBtn = new QPushButton(tr("关闭线程"));    mainLayout->addWidget(openThreadBtn);    mainLayout->addWidget(closeThreadBtn);    mainLayout->addStretch();    connect(openThreadBtn,SIGNAL(clicked(bool)),this,SLOT(openThreadSlot()));    connect(closeThreadBtn,SIGNAL(clicked(bool)),this,SLOT(closeThreadSlot()));} void Widget::openThreadSlot(){    /*开启一条多线程*/    qDebug()<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();                                                           //开启多线程槽函数    qDebug()<<"mainWidget QThread::currentThreadId()=="<isRunning())    {        myObjectThread->closeThread();  //关闭线程槽函数        firstThread->quit();            //退出事件循环        firstThread->wait();            //释放线程槽函数资源    }} void Widget::finishedThreadSlot(){    qDebug()<

main.cpp

#include "widget.h"#include  int main(int argc, char *argv[]){    QApplication a(argc, argv);    Widget w;    w.resize(960,640);    w.show();     return a.exec();}

1.2程序构建和运行后,结果如下图所示:

开启多线程

关闭多线程

以上就是Qt5.9如何继承QObject创建多线程,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

线程 函数 信号 代码 容器 对象 运行 实例 更多 界面 知识 篇文章 资源 循环 实用 事件 就是 工作会 工程 教程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 孝义im即时通讯软件开发 珠海无限软件开发批发价格 蔡甸专业的软件开发电话 服务器移动app管理 管道设计和管筒设计数据库 《网络安全审查办法》中国的网络 英雄联盟服务器断开链接怎么回事 关于网络安全宣传漫画 建行用什么数据库 纹样数据库建立的意义 商丘市网络技术公司 数据库期末例题 正在登录艾尔登法环游戏服务器 从服务器拷贝文件到本地 常宁网络安全态势感知装置 网络安全四害有哪些 健全网络安全评估 抚顺一手网络技术公司 云服务器桌面管理软件 在线考试软件开发价位 天津静海网络安全 在服务器上下载文件夹在哪 正规网络安全方案 新泰oa办公软件开发 数据库现状和发展 网络安全体系构件包括哪两项 服务器为何只显示第一块硬盘 长宁区网络软件开发机构整顿 网络安全教育班会课教学视频 吉安游戏软件开发在线咨询
0