Qt超時鎖屏的實現(xiàn)示例
概述
Qt實現(xiàn)超時鎖屏的功能(工控機觸摸屏),當手長時間不觸摸屏幕的時候,程序超時會顯示鎖屏窗口。
效果
主窗口超時顯示鎖屏窗口:
系統(tǒng)窗口超時顯示鎖屏窗口:
實現(xiàn)思路
- 首先開啟一個線程用于QTimer定時器計時,最開始進入軟件開啟定時器計時,超時則顯示鎖屏窗口;而手觸摸屏幕會觸發(fā)鼠標點擊事件,則停止計時;而手離開屏幕會觸發(fā)鼠標釋放事件,則重新開始計時。
- 因為是多窗口的應用軟件,所以需要監(jiān)控全局鼠標事件,所以需要子類化QApplication類。
核心代碼
監(jiān)控全局鼠標事件的類為GlobalApplication,其中也實現(xiàn)了開啟一個線程進行定時器計時,以及超時顯示鎖屏窗口的功能。
globalapplication.h 文件的內(nèi)容如下:
class GlobalApplication : public QApplication { Q_OBJECT public: GlobalApplication(int&argc,char **argv); ~GlobalApplication(); bool notify(QObject*, QEvent *); private slots: void onTimeOut(); //超時鎖屏槽函數(shù) private: myLockWindow *m_myLockWindow; //鎖屏窗口 QObject *m_currWinObj; //鼠標事件發(fā)生時的當前所在窗口 QTimer *m_pTimer; //定時器 QThread *m_pThread; //定時器線程 };
注:Widget_Lock 為鎖屏窗口類,可以替換成你自己要顯示的窗口。
globalapplication.cpp 文件的內(nèi)容如下:
#include "globalapplication.h" GlobalApplication::GlobalApplication(int &argc,char **argv): QApplication(argc,argv) { m_currWinObj = new QObject(); //初始化鼠標事件發(fā)生時的當前所在窗口 //初始化定時器線程和定時器 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())); //開啟線程,調(diào)用定時器的start() m_pThread->start(); m_myLockWindow = new myLockWindow(); //初始化鎖屏窗口 m_myLockWindow->m_unlockFlag = true; //初始化解除鎖屏成功標志 } GlobalApplication::~GlobalApplication() { //徹底結(jié)束線程(單獨的一個quit()無法徹底結(jié)束進程) m_pThread->requestInterruption(); m_pThread->quit(); m_pThread->wait(); } bool GlobalApplication::notify(QObject *obj, QEvent *e) { //因為鼠標點擊或滑動到任何窗口部件都會進入該函數(shù),所以根據(jù)objectName()過濾窗口部件 if(obj->objectName().right(1) == "W") //cleanW mainW { //工控機是觸摸屏,觸摸屏幕和滑動屏幕都會點擊屏幕,所以這里只檢測鼠標點擊事件 if(e->type() == QEvent::MouseButtonPress) //不區(qū)分左右鍵按下了 { //qDebug() << "objName:" << obj->objectName(); //qDebug()<<"press stop"; m_pThread->quit(); //線程結(jié)束后,則在此線程的定時器會自動停止計時 } else if(e->type() == QEvent::MouseButtonRelease) { //qDebug()<<"release start"; m_pThread->start(); //線程開始,會發(fā)送started()信號,啟動定時器的start()槽函數(shù) } m_currWinObj = obj; //獲得鼠標事件發(fā)生時的當前所在窗口 } return QApplication::notify(obj,e); } //超時鎖屏槽函數(shù) void GlobalApplication::onTimeOut() { //m_unlockFlag為false,表示鎖屏窗口未關(guān)閉,則即使再超時也不會再顯示鎖屏窗口 if(m_myLockWindow->m_unlockFlag == true) //當密碼輸入正確后,關(guān)閉鎖屏窗口,則會將m_unlockFlag設置為true { qDebug()<<"鎖屏"; //創(chuàng)建鎖屏窗口對象,并顯示該窗口 m_myLockWindow = new myLockWindow(); m_myLockWindow->show(); qDebug()<<"創(chuàng)建鎖屏窗口對象,并顯示該窗口"; //這行代碼要放在最后,因為在構(gòu)建對象時,會自動設置m_unlockFlag,所以在構(gòu)建后要復位m_unlockFlag m_myLockWindow->m_unlockFlag = false; } else { qDebug()<<"重復鎖屏"; } }
測試函數(shù)
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(); // 刷新事件循環(huán) Widget w; splash.finish(&w); // 完成后自動close w.show(); return a.exec(); }
到此這篇關(guān)于Qt超時鎖屏的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Qt超時鎖屏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C語言中free()函數(shù)與getpagesize()函數(shù)的使用
這篇文章主要介紹了詳解C語言中free()函數(shù)與getpagesize()函數(shù)的使用,是C語言入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08C語言 詳細分析結(jié)構(gòu)體的內(nèi)存對齊
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對齊2022-03-03C++ 數(shù)據(jù)結(jié)構(gòu)之水洼的數(shù)量算法
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之水洼的數(shù)量算法的相關(guān)資料,需要的朋友可以參考下2017-06-06完美解決QT?QGraphicsView提升到QChartView報錯的問題
使用QT提供的QChartView來繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫的類,怎么才能確保提升后編譯不報錯呢,下面小編給大家?guī)砹薗T QGraphicsView 提升到QChartView報錯解決方案,感興趣的朋友一起看看吧2023-05-05