Qt超时锁屏
C君莫笑 人气:4概述
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(); }
加载全部内容