Qt超时锁屏

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Qt超时锁屏

C君莫笑   2022-05-23 我要评论

概述

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

效果

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

实现思路

  • 首先开启一个线程用于QTimer定时器计时,最开始进入软件开启定时器计时,超时则显示锁屏窗口;而手触摸屏幕会触发鼠标点击事件,则停止计时;而手离开屏幕会触发鼠标释放事件,则重新开始计时。
  • 因为是多窗口的应用软件,所以需要监控全局鼠标事件,所以需要子类化QApplication类。

核心代码

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

globalapplication.h 文件的内容如下:

class GlobalApplication : public QApplication
{
    Q_OBJECT

public:
     GlobalApplication(int&argc,char **argv);
     ~GlobalApplication();

     bool notify(QObject*, QEvent *);

private slots:
    void onTimeOut(); //超时锁屏槽函数

private:
    myLockWindow *m_myLockWindow; //锁屏窗口
    QObject *m_currWinObj; //鼠标事件发生时的当前所在窗口

    QTimer *m_pTimer; //定时器
    QThread *m_pThread; //定时器线程
};

注: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 myLockWindow(); //初始化锁屏窗口
    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 myLockWindow();
        m_myLockWindow->show();
        qDebug()<<"创建锁屏窗口对象,并显示该窗口";

        //这行代码要放在最后,因为在构建对象时,会自动设置m_unlockFlag,所以在构建后要复位m_unlockFlag
        m_myLockWindow->m_unlockFlag = false;
    }
    else
    {
        qDebug()<<"重复锁屏";
    }
}

测试函数

int main(int argc, char *argv[])
{
    GlobalApplication a(argc, argv);

    QDesktopWidget *desktopWidget = QApplication::desktop();
    QRect screenRect = desktopWidget->screenGeometry();
    qDebug()<<screenRect.width();
    qDebug()<<screenRect.height();

    //获取计算机名称
    QString localHostName = QHostInfo::localHostName();
    qDebug() << "计算机名:" << localHostName;

    QPixmap pixmap(":/HeadImage.png"); // 装载图片
    QSplashScreen splash(pixmap); // 初始化图片到QSplashScreen
    splash.show(); // 显示图片
    a.processEvents(); // 刷新事件循环

    Widget w;
    splash.finish(&w); // 完成后自动close

     w.show();

    return a.exec();
}

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们