版权声明:所有的博客都是作为个人笔记的。。。。。。 https://blog.csdn.net/qq_35976351/article/details/82932713
QThread简介
最近开发某C++的AI项目,需要用到界面,为了计算过程不阻塞界面,需要使用多线程,在这里学习下Qt自带的多线程操作。
QThread是一个与平台无关的线程类,用于多线程的编程。具体可以在文档中中索引QThread关键字。实际开发中,一般继承这个类,然后运行类的run
函数,这也是一个槽,注意接受一个整型数据。耗时的操作放在run
函数中运行。
实际应用
下面给出一个多线程的模拟文件传输的例子。定义一个MyThread类,继承自QThread,在run函数中模拟一次传输。主界面显示进度。
运行效果:
初始化:
传输过程:
传输完毕:
该代码没有给出界面设计的,只要自己从中拖拽进去一个QPushButton、QProgressBar和QLabel即可,都是使用的默认名称。
自定义的类头文件
/*
* mythread.h
*/
#ifndef MYTHERAD_H
#define MYTHERAD_H
#include <QThread>
#include <QString>
class MyTherad : public QThread
{
Q_OBJECT
public:
MyTherad();
void run() override;
void startThread();
unsigned long t; // 间断时间
signals:
void resultReady(const QString &s);
void sendValue(int v); // 发送数据用的
};
#endif // MYTHERAD_H
实现文件
/*
* mythread.cpp
*/
#include "mytherad.h"
MyTherad::MyTherad()
{
t=100; // 默认睡眠1000毫秒
}
void MyTherad::run(){
QString result=tr("数据传输完毕!");
for(int i=0;i<=100;++i){
msleep(t);
sendValue(i); // 向外界发送数据
}
emit resultReady(result);
}
void MyTherad::startThread(){
run();
}
Widget窗口的头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QProgressBar>
#include <QLabel>
#include "mytherad.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
public slots:
void setText();
private:
Ui::Widget *ui;
MyTherad myThread;
};
#endif // WIDGET_H
Widget窗口的实现文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 重新显示文字,注意槽的连接顺序
QObject::connect(ui->pushButton,&QPushButton::clicked,this,&Widget::setText);
// 启动线程
QObject::connect(ui->pushButton,&QPushButton::clicked,&myThread,&MyTherad::startThread);
// 显示数据
QObject::connect(&myThread,&MyTherad::sendValue,ui->progressBar,&QProgressBar::setValue);
// 追加数据内容
QObject::connect(&myThread,&MyTherad::resultReady,ui->label,&QLabel::setText);
}
Widget::~Widget()
{
delete ui;
}
void Widget::setText(){
ui->label->setText("等待数据传输........");
}