效果展示
QTPro中加入DEFINES += QT_DEPRECATED_WARNINGS
会忽略许多警告
线程类
#includeclass Mythread : public QThread { Q_OBJECT public: explicit Mythread(QObject *parent = nullptr); protected: void run();//stop线程开启函数自动调用该函数 signals: void isDone();//线程信号,我们要做的就是这个信号处理 }; 主要处理void isDone()这个信号
线程实现函数
#include "mythread.h"
Mythread::Mythread(QObject *parent) : QThread(parent)
{
}
void Mythread::run()
{
//复杂的数据处理
//需要耗时3s
sleep(1000);
emit isDone();
}
此时已经把信号发射出去了,现在要做的就是接收和处理信号,然后再connect处理就好
这里指出
void run();//这个函数线程一开始就直接调用
界面实现类
#include#include #include #include "mythread.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); void dealDone(); private slots: void on_pushButton_clicked(); void dealTimeout(); private: Ui::Widget *ui; QTimer timer;//声明对象 Mythread *thread;//线程对象 };
#include "widget.h" #include "ui_widget.h" #includeWidget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //QTimer处理信号函数,一定要写,因为如果没有这个就没有随时间而动 connect(&timer,&QTimer::timeout,this,&Widget::dealTimeout); thread =new Mythread(this); //线程处理信号函数 connect(thread,&Mythread::isDone,this,&Widget::dealDone); } Widget::~Widget() { delete ui; } //开始计时函数,可以接收信号了,1000ms即1s,可以让按钮接收到,同时线程开始 void Widget::on_pushButton_clicked() { if(timer.isActive()==false) { timer.start(1000); } thread->start(); } //widget的时间信号处理函数 void Widget::dealTimeout() { //i做成静态,以便外面可以修改,但其实这里不是静态也没问题 static int i=0; i++; //让时间显示在IcdNumber上 ui->lcdNumber->display(i); } //widget特有的信号处理函数 void Widget::dealDone() { qDebug()<<"it is over"; timer.stop(); } //暂停函数,可以让线程死亡,也可以等待 void Widget::on_pushButton_2_clicked() { if(timer.isActive()==true) { timer.start(1000); thread->quit(); thread->wait(); } }



