Qt线程简单使用二:QObject~创建任务类

发布时间 2023-05-29 23:54:19作者: 十一的杂文录
 
需求:
  点击QPushButton按钮,QLabel中的数字,不断累加,一直到999。
 
做法:
  点击QPushButton后,启动线程,线程while循环,不断发送累加的数字会主线程,修改QLabel中的数字
 
其他:
  一个任务类,可以创建多个任务,写法麻烦一点,视情况决定是否采用这种方法。
 
 
主要代码:
// MyThread.h

#pragma once

#include <QObject>
#include <QThread>

class MyWork  : public QObject
{
    Q_OBJECT

public:
    MyWork(QObject *parent=nullptr);
    ~MyWork();
    
    void work();

signals:
    void sendNum(int num);
};

 

// MyThread.cpp

#include "MyThread.h"

MyWork::MyWork(QObject *parent)
    : QObject(parent)
{}

MyWork::~MyWork()
{}

void MyWork::work()
{
    int num = 0;
    while (num < 1000)
    {
        emit sendNum(num);
        num++;
        QThread::msleep(5);
    }
}

 

 

// QtWidgetsApplication1.cpp


#include "MyThread.h"


MyWidget::MyWidget(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);

    // 1.创建子线程对象
    QThread* t = new QThread;

    // 2.创建任务类对象
    MyWork* work = new MyWork;

    // 3.将任务类对象移动到子线程对象中
    work->moveToThread(t);

    // 开始工作
    connect(this, &MyWidget::startWork, work, &MyWork::work);
    connect(work, &MyWork::sendNum, this, [=](int num) {ui.label->setText(QString::number(num)); });
    connect(ui.pushButton, &QPushButton::clicked, this, [=]() 
        {
            emit startWork();
            t->start();
        });

    // 释放
    // 第一种:创建的时候,添加this参数,这样会自动析构,例:QThread* t = new QThread(this);
    // 第二种,手动释放
    connect(this, &MyWidget::destroy, [=]() {
        t->quit();
        t->wait();
        delete t;

        delete work;
        });
    
}