通过定时器模拟定时开启定时关闭

首先创建一个带ui的项目,添加三个控件,lable显示当前时间,pushButton启动线程,pushButton_2用来模拟能否点击,到点删除

 mainwindow.h

signals:
    //点击pushButton时发出信号,启动线程
    void fun_singl();

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


#include "myThread.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->pushButton_2->setEnabled(false);
    myThread *my = new myThread();

    connect(ui->pushButton,&QPushButton::clicked,this,[=](){
        emit fun_singl();
        qDebug()<<"开启线程";
    });

    connect(this,&MainWindow::fun_singl,my,&myThread::fun);

    //检测到信号,删除
    connect(my,&myThread::delbtn,this,[=](){
//        qDebug()<<"aa";
        if(ui->pushButton_2 != nullptr)
        {
            ui->pushButton_2->deleteLater();
            ui->pushButton_2 = nullptr;
        }
    });
    //更新时间
    connect(my,&myThread::renewal,this,[=](){
        QDateTime t = QDateTime::currentDateTime();
        QString time = t.toString("yyyy-MM-dd hh:mm:ss");
        ui->label->setText(time);
        if(ui->pushButton_2 != nullptr)
        {
            ui->pushButton_2->setEnabled(true);
        }
    });
}

myThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>

#include <QThread>
#include <QTimer>
#include <QDateTime>
#include <QDebug>


class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(QObject *parent = nullptr);
    ~myThread();
signals:
    void delbtn();
    void renewal();
public slots:
    void fun();
private:

    QTimer *timer;
};

#endif // MYTHREAD_H

myThread.cpp

void myThread::fun()
{
//    MainWindow *mainUi = new MainWindow();
    timer = new QTimer();
    connect(timer,&QTimer::timeout,this,[=](){
        QDateTime t = QDateTime::currentDateTime();
//        QString time = t.toString("yyyy-MM-dd hh:mm:ss");
//        mainUi->getLabel()->setText(time);
        QDateTime anticipateTime = QDateTime::fromString("2023-10-13 14:18:20", "yyyy-MM-dd hh:mm:ss");
        QDateTime delTime = QDateTime::fromString("2023-10-13 14:18:30", "yyyy-MM-dd hh:mm:ss");
        if(t >= anticipateTime)//达到启动时间
        {
            //通知主线程更新时间
            emit renewal();
//            qDebug()<<time;
        }
        if(t >= delTime)//达到删除时间
        {
            emit delbtn();
//            terminate();
        }
    });
    timer->start(1000);
}

效果

开始时需点击启动按钮启动线程,lable不显示,pushButton_2不能点击

到达anticipateTime  pushButton_2能点击,lable显示当前时间

到达delTime  pushButton_2删除,lable继续显示时间

暂时就这样了,欢迎大佬来指教 

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值