Qt超時(shí)鎖屏的實(shí)現(xiàn)示例
概述
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ī)名稱(chēng)
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();
}
到此這篇關(guān)于Qt超時(shí)鎖屏的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Qt超時(shí)鎖屏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)
這篇文章住要介紹的是選擇類(lèi)排序中的簡(jiǎn)單、樹(shù)形和堆排序,歸并排序、分配類(lèi)排序的基數(shù)排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2021-12-12
C++實(shí)現(xiàn)基于reactor的百萬(wàn)級(jí)并發(fā)服務(wù)器
本文介紹了基于Reactor模式的百萬(wàn)級(jí)并發(fā)服務(wù)器,使用epoll進(jìn)行高效I/O多路復(fù)用,支持多個(gè)端口的監(jiān)聽(tīng),并通過(guò)回調(diào)機(jī)制處理每個(gè)連接的接收和發(fā)送操作,需要的朋友可以參考下2025-02-02
C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
opencv 做人臉識(shí)別 opencv 人臉匹配分析
opencv 人臉識(shí)別通過(guò)級(jí)聯(lián)分類(lèi)器對(duì)特征的分級(jí)篩選來(lái)確定是否是人臉,每個(gè)節(jié)點(diǎn)的正確識(shí)別率很高,但正確拒絕率很低,任一節(jié)點(diǎn)判斷沒(méi)有人臉特征則結(jié)束運(yùn)算,宣布不是人臉2012-11-11
C語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī)的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī),可識(shí)別的單詞包括:關(guān)鍵字、界符、標(biāo)識(shí)符和常整型數(shù),感興趣的小伙伴可以了解一下2022-12-12
c++?創(chuàng)建型設(shè)計(jì)模式工廠方法Factory?Method示例詳解
這篇文章主要為大家介紹了c++?創(chuàng)建型設(shè)計(jì)模式工廠方法Factory?Method示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

