【QT】QT Qtimer定时的使用 含屏保功能实现,鼠标无操作后处理事件

新建一个工程项目

我们的编程语言里面都有个定时器这样的类或者函数,定时器一般就是设定一个时间间隔,会自动发送一个信号,我们需要处理这个信号,也就是一个槽函数。因为QT是信号和槽的机制。定时操作有很多有用的应用,比如定时关机,可以长时间未操作锁屏,屏保。自动加密等功能,用处还有很多。

我下面实现的是

1.无操作继续运行,点击左键或者右键自动关闭窗口

添加头文件

#include <QMainWindow>
#include <QTimer>
#include <QMouseEvent>
#include <QDebug>

添加函数声明

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QTimer *timer_;
    int flag=1;
    void handle_timeout(void);

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);

添加.cpp代码

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer_ = new QTimer(this);
    connect(timer_,&QTimer::timeout,this,&MainWindow::handle_timeout);
    timer_->start(1000); //开启定时,1秒(1000毫秒)发送一个超时信号
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle_timeout()
{
    if(flag==1){
        timer_->stop();     //停止定时器
        timer_->start(1000); //开启定时器
//        flag=0;
        qDebug() <<"flag" << QString::number(flag,10);
    }
    if(flag==0){
        qDebug() <<"flag" << QString::number(flag,10);
           this->close();
        


    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << "move";

}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        flag = 0;
	qDebug() << "按下左键";

    }
    if(event->button() == Qt::RightButton){
        flag = 0;
	qDebug() << "按下右键";

    }
}

演示

按左键退出,响应时间1秒

flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "0"

按右键退出,响应时间1秒

flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下右键
flag "0"

上面当flag为1时,一直定时1S发送信号,不做处理,只打印出当前flag的值,当按下左键或者右键时,flag的值变为0,过了一秒钟,定时器发送信号,然后进行处理信号,在handle_timeout函数中,判断flag等于0时,打印flag的值为0,紧接着关闭窗口。

2.延长关闭时间

我们来改改,将点击后的时间延长点,这么来说我们需要添加一个变量,这个变量是用来记录在flag为0时候,发送信号的次数。当达到或超过记录的次数时,进行关闭窗口。

添加变量声明

 public:
   int time_num=0;

修改.cpp代码

void MainWindow::handle_timeout()
{
    if(flag==1){
        timer_->stop();
        timer_->start(1000);


//        flag=0;
        qDebug() <<"flag" << QString::number(flag,10);
    }
    if(flag==0){
        time_num+=1;
        qDebug() <<"flag" << QString::number(flag,10);
        if(time_num >=10){

           this->close();
        }


    }
}

演示

按下左键后10S关闭

flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "0"
flag "0"
flag "0"
flag "0"
flag "0"
flag "0"
flag "0"
flag "0"
flag "0"
flag "0"
关闭

3.添加启动之后10S自动关闭

现在我们再改改,让它开启之后10S自动关闭,如果按下左键右键重新计时,再过10S自动关闭

 

我们改两个地方,其余不变

改处理超时函数

void MainWindow::handle_timeout()
{
    if(flag==1){
        qDebug() <<"flag" << QString::number(flag,10);
        time_num+=1;
        timer_->stop();
        timer_->start(1000);
        if(time_num>=10){
            flag=0;
        }

    }
    if(flag==0){

        qDebug() <<"flag" << QString::number(flag,10);

            qDebug() << "关闭";
           this->close();

    }
}

改鼠标事件函数

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        flag = 1;
        time_num=0;
        qDebug() << "按下左键";
    }
    if(event->button() == Qt::RightButton){
        flag = 1;
        time_num=0;
        qDebug() << "按下右键";
    }
}

演示

flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "1"
flag "1"
flag "1"
按下右键
move
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
按下左键
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "1"
flag "0"
关闭

4.我们来区分一下,定时器停止与停止后开启的效果

我们修改一下只需要修改一下处理超时函数handle_timeout就可以了,这次我们不点击左右键。

定时器停止

void MainWindow::handle_timeout()
{
    if(flag==1){
        qDebug() <<"flag" << QString::number(flag,10);
        timer_->stop();
        qDebug() << "停止";
//        timer_->start(1000);
    }
    if(flag==0){
        time_num+=1;
        qDebug() <<"flag" << QString::number(flag,10);
        if(time_num >=10){
            qDebug() << "关闭";
           this->close();
        }


    }
}

演示

flag "1"
停止

我们可以看到,打印了一次flag就停止了,效果很明显。

 

下面我们停止后开启定时。

void MainWindow::handle_timeout()
{
    if(flag==1){
        qDebug() <<"flag" << QString::number(flag,10);
        timer_->stop();
        qDebug() << "停止";
        timer_->start(1000);
        qDebug() << "开启";
    }
    if(flag==0){
        time_num+=1;
        qDebug() <<"flag" << QString::number(flag,10);
        if(time_num >=10){
            qDebug() << "关闭";
           this->close();
        }


    }
}

演示

flag "1"
停止
开启
flag "1"
停止
开启
flag "1"
停止
开启
flag "1"
停止
开启
flag "1"
停止
开启
flag "1"
停止
开启
flag "1"
停止
开启

我们可以看到,停止后开启,定时发送。正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GLL_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值