Qt的线程类QThread提供了常用方法,需要集成后使用。提供了线程入口函数run,这是一个受保护的虚函数,需要重新实现自定义代码。下面创建一个小的场景,线程的开始与停止受到主界面的按钮控制,一旦线程开始运行,则发出超时信号(时间间隔对外提供方法设置),主线程接收超时信号并进行处理,让LCD显示部件加1。
步骤1.创建主界面类,并设计ui界面如下:
2.新建c++类继承自QThread
a.新建类继承时通常选择继承自QWidget,等待创建好之后在修改。添加QThread头文件;修改从哪个类继承,在代码部分我已做了标注。
b.重新run函数,run函数重写成每隔固定的时间间隔发出一个信号。
c.对外提供一个可以修改这个时间间隔的方法
3.主线程中创建子线程类对象
a.使用按钮控制子线程的开始与暂停
b.接收子线程的信号,并进行处理,让LCD每次收到信号加1。
在信号与槽 一节提到过connect函数第五个参数的作用,采用Qt::BlockingQueuedConnection参数让子线程阻塞,直到主线程处理完毕,也就是同步处理,区别于Qt::QueuedConnection参数等控制权回到主线程在执行处理。这是需要注意的一点,实际应用中应结合具体的应用需求选择合适的参数。
效果与代码部分一致,每2秒发送一次信号
main
#include "widget.h" #includeint main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
widget.h主线程
#ifndef WIDGET_H #define WIDGET_H #include#include "mythread.h" QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void doProcessTimeOut(); void on_startBtn_clicked(); void on_stopBtn_clicked(); private: Ui::Widget *ui; myThread *thr; int index; }; #endif // WIDGET_H
widget.cpp主线程
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
index = 0;
thr = new myThread(this);
connect(thr,SIGNAL(signalTimeOut()),this,SLOT(doProcessTimeOut()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::doProcessTimeOut()
{
index++;
if(index==101)
{
index=0;
}
ui->lcdNumber->display(index);
}
void Widget::on_startBtn_clicked()
{
//可修改时间间隔
thr->setTimeSecend(2);//修改每两秒加1
thr->start();
}
void Widget::on_stopBtn_clicked()
{
thr->terminate();
}
mythread.h子线程
#ifndef MYTHREAD_H #define MYTHREAD_H #include#include //添加头文件 class myThread : public QThread//继承修改1 { Q_OBJECT public: explicit myThread(QWidget *parent = nullptr);//构造函数参数,可不改 void setTimeSecend(int sec); protected: void run(); signals: signalTimeOut(); private: int time_sec; }; #endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
myThread::myThread(QWidget *parent) : QThread(parent)//继承修改2
{
time_sec = 1;
}
void myThread::run()
{
while (1) {
sleep(time_sec);
emit signalTimeOut();
}
}
void myThread::setTimeSecend(int sec)
{
time_sec = sec;
}



