Qt5基础系列
Qt基础的学习笔记。此文章为在B站上学习黑马程序员Qt教程的为什么要使用线程部分做的记录,加深理解,方便回看。
一、为什么要使用线程?
我们通过一个代码示例来解释:
1、头文件
声明了一个公有定时器槽函数和一个私有定时器变量,以及一个按钮点击事件。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer> //定时器头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void dealTimeout();//定时器槽函数
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTimer *myTimer;//声明定时器变量
};
#endif // WIDGET_H
2、引入类
#include "widget.h"
#include "ui_widget.h"
#include <QThread>
#include <QDebug>
3、主程序
我们设置了一个定时器,实现计时,设置了一个按钮来启动定时。
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myTimer = new QTimer(this);
//只要定时器启动,自动触发timeout()
//myTimer向本窗口发送timeout类型的请求,槽函数为dealTimeout
connect(myTimer,&QTimer::timeout,this,&Widget::dealTimeout);
}
void Widget::dealTimeout()
{
static int i = 0;
i++;
//设置lcd的值
ui->lcdNumber->display(i);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//
if(myTimer->isActive()== false)
{
myTimer->start(100);
}
//非常复杂的数据处理,耗时间长
QThread::sleep(5);//这边在sleep,所以反馈无响应
//处理完数据后,关闭定时器,等sleep完了,也结束了,所以定时器没有显示出来
//myTimer->stop();
qDebug() << "over";
}
4、截图及分析
在本示例中,这里5s内无响应,点击启动在5s后才开始计时。所以sleep和计时是先后工作。如果我们希望复杂的数据处理(比如sleep)能够和定时器同时工作,则需要用到线程,多个任务同时进行。
二、总结
以上简单介绍了为什么要使用线程。接下来会记录多线程的使用。