zoukankan      html  css  js  c++  java
  • Qt 实现超时锁屏

    最近使用Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口。


    一、效果

    主窗口超时显示锁屏窗口:


    系统窗口超时显示锁屏窗口:


    二、实现思路

    首先开启一个线程用于QTimer定时器计时,最开始进入软件开启定时器计时,超时则显示锁屏窗口;而手触摸屏幕会触发鼠标点击事件,则停止计时;而手离开屏幕会触发鼠标释放事件,则重新开始计时。线程与定时器参考了这篇博客:Qt——线程与定时器

    因为是多窗口的应用软件,所以需要监控全局鼠标事件,所以需要子类化QApplication类,这里我参考了这篇博客:QT中监控全局键盘鼠标事件

    注:稍加修改,可以用在PC端的应用软件上,进一步检测鼠标移动事件和键盘事件即可。


    三、实现代码

    监控全局鼠标事件的类为GlobalApplication,其中也实现了开启一个线程进行定时器计时,以及超时显示锁屏窗口的功能。

    globalapplication.h 文件的内容如下:

    #ifndef GLOBALAPPLICATION_H
    #define GLOBALAPPLICATION_H
    
    #include <QApplication>
    #include <QMouseEvent>
    #include <QThread>
    #include <QTimer>
    #include <QDebug>
    #include "widget_lock.h"
    
    class GlobalApplication : public QApplication
    {
        Q_OBJECT
    
    public:
         GlobalApplication(int&argc,char **argv);
         ~GlobalApplication();
    
         bool notify(QObject*, QEvent *);
    
    private slots:
        void onTimeOut(); //超时锁屏槽函数
    
    private:
        Widget_Lock *m_myLockWindow; //锁屏窗口
        QObject *m_currWinObj; //鼠标事件发生时的当前所在窗口
    
        QTimer *m_pTimer; //定时器
        QThread *m_pThread; //定时器线程
    };
    
    #endif // GLOBALAPPLICATION_H
    

    注:Widget_Lock 为锁屏窗口类,具体实现代码在这里由于篇幅问题不再贴出,可以替换成你自己要显示的窗口。


    globalapplication.cpp 文件的内容如下:

    #include "globalapplication.h"
    
    GlobalApplication::GlobalApplication(int &argc,char **argv):
    QApplication(argc,argv)
    {
        m_currWinObj = new QObject(); //初始化鼠标事件发生时的当前所在窗口
    
        //初始化定时器线程和定时器
        m_pThread = new QThread(this);
        m_pTimer = new QTimer();
        m_pTimer->moveToThread(m_pThread);
        m_pTimer->setInterval(4000);
        connect(m_pThread, SIGNAL(started()), m_pTimer, SLOT(start()));
        connect(m_pTimer, SIGNAL(timeout()),this,SLOT(onTimeOut()));
        //开启线程,调用定时器的start()
        m_pThread->start();
    
        m_myLockWindow = new Widget_Lock(); //初始化锁屏窗口
        m_myLockWindow->m_unlockFlag = true; //初始化解除锁屏成功标志
    }
    
    GlobalApplication::~GlobalApplication()
    {
        //彻底结束线程(单独的一个quit()无法彻底结束进程)
        m_pThread->requestInterruption();
        m_pThread->quit();
        m_pThread->wait();
    }
    
    bool GlobalApplication::notify(QObject *obj, QEvent *e)
    {
        //因为鼠标点击或滑动到任何窗口部件都会进入该函数,所以根据objectName()过滤窗口部件
        if(obj->objectName().right(1) == "W") //cleanW mainW
        {
            //工控机是触摸屏,触摸屏幕和滑动屏幕都会点击屏幕,所以这里只检测鼠标点击事件
            if(e->type() == QEvent::MouseButtonPress) //不区分左右键按下了
            {
                //qDebug() << "objName:" << obj->objectName();
                //qDebug()<<"press stop";
                m_pThread->quit(); //线程结束后,则在此线程的定时器会自动停止计时
            }
            else if(e->type() == QEvent::MouseButtonRelease)
            {
                //qDebug()<<"release start";
                m_pThread->start(); //线程开始,会发送started()信号,启动定时器的start()槽函数
            }
    
            m_currWinObj = obj; //获得鼠标事件发生时的当前所在窗口
        }
    
        return QApplication::notify(obj,e);
    }
    
    //超时锁屏槽函数
    void GlobalApplication::onTimeOut()
    {
        //m_unlockFlag为false,表示锁屏窗口未关闭,则即使再超时也不会再显示锁屏窗口
        if(m_myLockWindow->m_unlockFlag == true) //当密码输入正确后,关闭锁屏窗口,则会将m_unlockFlag设置为true
        {
            qDebug()<<"锁屏";
            //创建锁屏窗口对象,并显示该窗口
            m_myLockWindow = new Widget_Lock(static_cast<QWidget *>(m_currWinObj));
            m_myLockWindow->show();
    
            //这行代码要放在最后,因为在构建对象时,会自动设置m_unlockFlag,所以在构建后要复位m_unlockFlag
            m_myLockWindow->m_unlockFlag = false;
        }
        else
            qDebug()<<"重复锁屏";
    }
    

    然后将main函数里的 Application a(argc, argv); 换成:GlobalApplication a(argc, argv);这样在任何窗口点击鼠标,都能响应到,并获得鼠标事件发生时的当前所在窗口。当超时后,在当前所在窗口显示锁屏窗口。


    参考:

    QT中监控全局键盘鼠标事件

    Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态

    Qt——线程与定时器


  • 相关阅读:
    STM32F401+nRF24L01无线传输音频(对讲机原型)
    Keil MDK STM32系列(五) 使用STM32CubeMX创建项目基础结构
    Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发
    Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发
    PlatformIO下的STM32F4xx项目配置
    nRF24L01基于FIFO TX队列的发送性能优化
    个人发展计划IDP 与Smart原则
    IDEA Maven 项目默认编译项目为JDK 1.5
    投资 学习 成长 判断力 面对挫折
    投资 价值 道德 长期主义(5,10,20年)三观
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11171322.html
Copyright © 2011-2022 走看看