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

一、效果

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

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

二、实现思路

首先开启一个线程用于QTimer定时器计时,最开始进入软件开启定时器计时,超时则显示锁屏窗口;而手触摸屏幕会触发鼠标点击事件,则停止计时;而手离开屏幕会触发鼠标释放事件,则重新开始计时。线程与定时器参考了这篇博客:Qt——线程与定时器。

因为是多窗口的应用软件,所以需要监控全局鼠标事件,所以需要子类化QApplication类,这里我参考了这篇博客:QT中监控全局键盘鼠标事件。

注:稍加修改,可以用在PC端的应用软件上,进一步检测鼠标移动事件和键盘事件即可。

三、实现代码

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

globalapplication.h 文件的内容如下:

#ifndef GLOBALAPPLICATION_H

#define GLOBALAPPLICATION_H

#include

#include

#include

#include

#include

#include "widget_lock.h"

class GlobalApplication : public QApplication

{

Q_OBJECT

public:

GlobalApplication(int&argc,char **argv);

~GlobalApplication();

bool notify(QObject*, QEvent *);

private slots:

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

private:

Widget_Lock *m_myLockWindow; //锁屏窗口

QObject *m_currWinObj; //鼠标事件发生时的当前所在窗口

QTimer *m_pTimer; //定时器

QThread *m_pThread; //定时器线程

};

#endif // GLOBALAPPLICATION_H

注: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 Widget_Lock(); //初始化锁屏窗口

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()<

m_pThread->quit(); //线程结束后,则在此线程的定时器会自动停止计时

}

else if(e->type() == QEvent::MouseButtonRelease)

{

//qDebug()<

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 Widget_Lock(static_cast(m_currWinObj));

m_myLockWindow->show();

//这行代码要放在最后,因为在构建对象时,会自动设置m_unlockFlag,所以在构建后要复位m_unlockFlag

m_myLockWindow->m_unlockFlag = false;

}

else

qDebug()<

}

然后将main函数里的 Application a(argc, argv); 换成:GlobalApplication a(argc, argv);这样在任何窗口点击鼠标,都能响应到,并获得鼠标事件发生时的当前所在窗口。当超时后,在当前所在窗口显示锁屏窗口。

参考:

qt android屏幕锁屏,Qt 实现超时锁屏相关推荐

  1. qt android图片自适应大小,Qt on Android:怎样适应不同的屏幕尺寸

    使用 Qt 开发的 Android 应用,怎样适应 Android 智能手机各种各样的屏幕尺寸? 说到屏幕尺寸,从 2.8 吋到 8.9 吋的手机屏幕都有,这对程序猿们来讲痛苦可不只一点. Andro ...

  2. qt android安装在哪,Qt On Android开发环境安装、配置

    本文记录在Windows 8.1下,Qt on Android 5.5开发环境的安装和配置. 1.安装JDK 到甲骨文网站下载JDK:http://www.oracle.com 下载安装成功后,设置环 ...

  3. qt android播放器代码,Qt on android 播放视频的实现

    本文介绍的是使用QML进行视频的播放,可以直接编译为APK在android上运行. QML中对多媒体的处理提供了很多方便的组件,对于播放音频.视频都很方便.这些多媒体组件属于Qt Multimedia ...

  4. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include #include #include # ...

  5. qt android opengl,案例:实现Qt和OpenGL混合渲染 | 求索阁

    Qt自有一个绘图的引擎,这个引擎的核心就是QPainter,我们知道QPainter在渲染二维图形和文字有很大的优势,而OpenGL是当前流行的三维渲染器,怎样才能将两者结合起来,制作更为丰富的应用程 ...

  6. qt android文件读写文件,qt android 开发之写入xml配置文件篇

    应用初始化本地数据,需要读取配置文件,小编介绍如何通过xml简单写入配置文件,至于为什么选择这个格式,主要因为在qml中有一个很好 的类使用:XmlListModel xmlListModel能直接读 ...

  7. qt android漂亮控件,qt android 开发之炫酷控件的制做

    手机应用开发,就是吸引用户,要吸引用户,确定离不开用户体验!此次给你们分享一个自做的炫酷qml控件:fanControler 这个控件目前有点bug,不过整体效果仍是很赞的,经过滑动划片来控制风扇的转 ...

  8. android设置不锁屏adb,如何通过ADB锁定Android屏幕?

    如何通过ADB锁定Android屏幕? 有没有办法通过ADB锁定Android屏幕? 我找到了将显示锁定在apk中的方法,但是我想通过ADB从PC锁定屏幕,以模拟显示超时,而不必等待超时. 是否有可能 ...

  9. android系统锁屏锁怎么解决方法,Android 屏幕锁 - WakeLock

    Android 屏幕锁 - WakeLock Android,powermanager,wakelock,屏幕, PowerManager android.os.PowerManager PowerM ...

最新文章

  1. Silverlight中使用控件模板的问题(自己添加控件的方法)
  2. helm滚动更新mysql_kubernetes使用helm滚动更新
  3. cookie版购物车
  4. 我的技术回顾那些与ABP框架有关的故事-2017年
  5. Linux shell脚本启动 停止 重启jar包
  6. visio防火墙可以连接什么_画流程图,就是要用Visio软件!
  7. android edittext drawable,android – 在事件上显示复合drawable到EditText
  8. (转自YYW'S BLOG)IListT 转换成 DataSet
  9. vst和vst3插件_用于家庭录音的经典VST插件
  10. php实现身份证号码获取归属地地址的实例
  11. [已解决] idea插件下载不了
  12. 并购支付牌照中金支付90.01%股权该注意哪些风险
  13. Predicting Ship T rajectory Based on Neural Networks UsingAIS Data
  14. ❤echarts 南丁格尔玫瑰图的使用以及南丁格尔玫瑰图详细配置
  15. 学计算机Java和c语言哪个出路比较好
  16. 1688采源宝的商家靠谱吗 怎么入驻成为阿里采源宝商家
  17. [Django1.5] two-scoops-django-best-practices 读书笔记
  18. 微谈网页设计颜色搭配原则与方法
  19. fast角点与ShiTomas角点速度对比
  20. Mac常备必用的软件-mac软件推荐

热门文章

  1. 安卓耳机左右音量调节_教你一招,手机耳机音量一键同步!
  2. Java正则匹配数字,小数点后两位数字,区间表达式
  3. 【西川善司】3D图形的概念和渲染管线(5回完)
  4. honeynet/honeypot
  5. 我的世界服务器显示标指令,我的世界服务器指令|我的世界服务器指令大全
  6. 勇闯死人谷2服务器维护么,勇闯死人谷2怎么玩 Into the Dead 2玩法介绍
  7. 餐饮+KTV融合消费模式,会受消费者喜欢吗?
  8. Winows 8 激活方法
  9. 拉普拉斯,帮我看看这个怎么回事呢?
  10. 基于微信小程序的词汇听写系统