【QT】用QThread设计的定时器(九)

相关连接

1、QT多线程使用
2、QT子线程读取串口数据并传到主线程
3、qt线程通信(通过信号触发来传递参数)

一、 逻辑思路:

1、创建继承QWidget的qt界面类,添加新文件-添加类-命名为myThread类,该类继承QWidget,但在文件继承中要更改为QThread,如下图所示。
2、线程设计:创建线程发射信号,对run函数进行实现,其中run函数相当于main函数,创建线程后会自动调用run函数。
3、主界面设计:对开始和停止按钮创建槽函数,对线程启动(start)和终止(terminate)写入槽函数中;创建线程发射信号连接connect,对连接槽函数实现lcd_number进行display显示。
注意:

1、调试线程可以在qDebug()输出查看数据,且在debug模式打断点调试可用。
2、发射信号时,若函数带有参数不能实现信号传送
3、发射信号需为元数据结构,如果要用自己定义的数据类型,需要在connect前将其注册为元数据类型。见链接(3),即在调用connect的前面调用RegisterMetaType(“Student”);把这个Student类型注册成元数据
4、非实参的参数均可只使用数据类型表示
5、子线程数据发送至主线程,代码中显示;但如何将主线程的数据处理完发给子线程呢?设置主线程信号自行发射信号,接收槽函数为子线程即可

//设置主线程信号自行发射信号,接收槽函数为子线程即可
connect(this,SIGNAL(close_serial(char*)),mthread,SLOT(close_mthread_serial(char*)));
//

二、继承更改

将QWidget更改为QThread,如果创建类时直接继承QThread会出现信号不可实现。
在这里插入图片描述
在这里插入图片描述

三、界面实现

点击开始按钮即可进行每秒更新一次,当更新至100秒时会重新计数
在这里插入图片描述

四、代码

widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "mythread.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    myThread *mythread;
    int index;

private slots:
    void onprocessTimeOut();
    void on_ptn_start_clicked();
    void on_ptn_stop_clicked();
};
#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;
    mythread = new myThread();
    connect(mythread,SIGNAL(SignalTimeOut()),this,SLOT(onprocessTimeOut()));
}

Widget::~Widget()
{
    delete mythread;
    delete ui;
}

void Widget::onprocessTimeOut()
{
    index++;
    if(index == 101)
        index = 0;

    ui->lcdNumber->display(index);
}
void Widget::on_ptn_start_clicked()
{
    mythread->set_timesec(1);
    mythread->start();
}

void Widget::on_ptn_stop_clicked()
{
    mythread->terminate();
}
myThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QWidget>
#include <QThread>

class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(QThread *parent = 0);
    void set_timesec(int sec);
signals:
    void SignalTimeOut();
protected:
    void run();
private:
    int time_sec;
};
#endif // MYTHREAD_H
myThread.cpp
#include "mythread.h"

myThread::myThread(QThread *parent) : QThread(parent)
{
    time_sec = 1;
}
void myThread::run()
{
    while(1){
        sleep(time_sec);
    emit SignalTimeOut();
    }
}
void myThread::set_timesec(int sec)
{
    this->time_sec = sec;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值