網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
概述
Qt實(shí)現(xiàn)超時(shí)鎖屏的功能(工控機(jī)觸摸屏),當(dāng)手長(zhǎng)時(shí)間不觸摸屏幕的時(shí)候,程序超時(shí)會(huì)顯示鎖屏窗口。
效果
主窗口超時(shí)顯示鎖屏窗口:
系統(tǒng)窗口超時(shí)顯示鎖屏窗口:
實(shí)現(xiàn)思路
- 首先開(kāi)啟一個(gè)線程用于QTimer定時(shí)器計(jì)時(shí),最開(kāi)始進(jìn)入軟件開(kāi)啟定時(shí)器計(jì)時(shí),超時(shí)則顯示鎖屏窗口;而手觸摸屏幕會(huì)觸發(fā)鼠標(biāo)點(diǎn)擊事件,則停止計(jì)時(shí);而手離開(kāi)屏幕會(huì)觸發(fā)鼠標(biāo)釋放事件,則重新開(kāi)始計(jì)時(shí)。
- 因?yàn)槭嵌啻翱诘膽?yīng)用軟件,所以需要監(jiān)控全局鼠標(biāo)事件,所以需要子類(lèi)化QApplication類(lèi)。
核心代碼
監(jiān)控全局鼠標(biāo)事件的類(lèi)為GlobalApplication,其中也實(shí)現(xiàn)了開(kāi)啟一個(gè)線程進(jìn)行定時(shí)器計(jì)時(shí),以及超時(shí)顯示鎖屏窗口的功能。
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í)鎖屏槽函數(shù) private: myLockWindow *m_myLockWindow; //鎖屏窗口 QObject *m_currWinObj; //鼠標(biāo)事件發(fā)生時(shí)的當(dāng)前所在窗口 QTimer *m_pTimer; //定時(shí)器 QThread *m_pThread; //定時(shí)器線程 };
注:Widget_Lock 為鎖屏窗口類(lèi),可以替換成你自己要顯示的窗口。
globalapplication.cpp 文件的內(nèi)容如下:
#include "globalapplication.h" GlobalApplication::GlobalApplication(int &argc,char **argv): QApplication(argc,argv) { m_currWinObj = new QObject(); //初始化鼠標(biāo)事件發(fā)生時(shí)的當(dāng)前所在窗口 //初始化定時(shí)器線程和定時(shí)器 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())); //開(kāi)啟線程,調(diào)用定時(shí)器的start() m_pThread->start(); m_myLockWindow = new myLockWindow(); //初始化鎖屏窗口 m_myLockWindow->m_unlockFlag = true; //初始化解除鎖屏成功標(biāo)志 } GlobalApplication::~GlobalApplication() { //徹底結(jié)束線程(單獨(dú)的一個(gè)quit()無(wú)法徹底結(jié)束進(jìn)程) m_pThread->requestInterruption(); m_pThread->quit(); m_pThread->wait(); } bool GlobalApplication::notify(QObject *obj, QEvent *e) { //因?yàn)槭髽?biāo)點(diǎn)擊或滑動(dòng)到任何窗口部件都會(huì)進(jìn)入該函數(shù),所以根據(jù)objectName()過(guò)濾窗口部件 if(obj->objectName().right(1) == "W") //cleanW mainW { //工控機(jī)是觸摸屏,觸摸屏幕和滑動(dòng)屏幕都會(huì)點(diǎn)擊屏幕,所以這里只檢測(cè)鼠標(biāo)點(diǎn)擊事件 if(e->type() == QEvent::MouseButtonPress) //不區(qū)分左右鍵按下了 { //qDebug() << "objName:" << obj->objectName(); //qDebug()<<"press stop"; m_pThread->quit(); //線程結(jié)束后,則在此線程的定時(shí)器會(huì)自動(dòng)停止計(jì)時(shí) } else if(e->type() == QEvent::MouseButtonRelease) { //qDebug()<<"release start"; m_pThread->start(); //線程開(kāi)始,會(huì)發(fā)送started()信號(hào),啟動(dòng)定時(shí)器的start()槽函數(shù) } m_currWinObj = obj; //獲得鼠標(biāo)事件發(fā)生時(shí)的當(dāng)前所在窗口 } return QApplication::notify(obj,e); } //超時(shí)鎖屏槽函數(shù) void GlobalApplication::onTimeOut() { //m_unlockFlag為false,表示鎖屏窗口未關(guān)閉,則即使再超時(shí)也不會(huì)再顯示鎖屏窗口 if(m_myLockWindow->m_unlockFlag == true) //當(dāng)密碼輸入正確后,關(guān)閉鎖屏窗口,則會(huì)將m_unlockFlag設(shè)置為true { qDebug()<<"鎖屏"; //創(chuàng)建鎖屏窗口對(duì)象,并顯示該窗口 m_myLockWindow = new myLockWindow(); m_myLockWindow->show(); qDebug()<<"創(chuàng)建鎖屏窗口對(duì)象,并顯示該窗口"; //這行代碼要放在最后,因?yàn)樵跇?gòu)建對(duì)象時(shí),會(huì)自動(dòng)設(shè)置m_unlockFlag,所以在構(gòu)建后要復(fù)位m_unlockFlag m_myLockWindow->m_unlockFlag = false; } else { qDebug()<<"重復(fù)鎖屏"; } }
測(cè)試函數(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(); //獲取計(jì)算機(jī)名稱 QString localHostName = QHostInfo::localHostName(); qDebug() << "計(jì)算機(jī)名:" << localHostName; QPixmap pixmap(":/HeadImage.png"); // 裝載圖片 QSplashScreen splash(pixmap); // 初始化圖片到QSplashScreen splash.show(); // 顯示圖片 a.processEvents(); // 刷新事件循環(huán) Widget w; splash.finish(&w); // 完成后自動(dòng)close w.show(); return a.exec(); }
原文鏈接:https://blog.csdn.net/qq_34623621/article/details/122326466
相關(guān)推薦
- 2022-06-08 Spring Cloud Nacos NacosWatch
- 2022-06-11 詳解如何在Flutter中獲取設(shè)備標(biāo)識(shí)符_Android
- 2022-04-30 DataGridView自定義單元格表示值、Error圖標(biāo)顯示的方法介紹_C#教程
- 2022-07-08 分割python多空格字符串的兩種方法小結(jié)_python
- 2023-06-05 Python?numpy有哪些常用數(shù)據(jù)類(lèi)型_python
- 2024-03-08 SpringBoot開(kāi)發(fā)中VO、DTO的作用,以及使用場(chǎng)景
- 2022-06-18 使用OpenGL創(chuàng)建窗口的示例詳解_C 語(yǔ)言
- 2022-12-22 python實(shí)現(xiàn)將list拼接為一個(gè)字符串_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支