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

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

二、实现思路
首先开启一个线程用于QTimer定时器计时,最开始进入软件开启定时器计时,超时则显示锁屏窗口;而手触摸屏幕会触发鼠标点击事件,则停止计时;而手离开屏幕会触发鼠标释放事件,则重新开始计时。线程与定时器参考了这篇博客:Qt——线程与定时器。
因为是多窗口的应用软件,所以需要监控全局鼠标事件,所以需要子类化QApplication类,这里我参考了这篇博客:QT中监控全局键盘鼠标事件。
注:稍加修改,可以用在PC端的应用软件上,进一步检测鼠标移动事件和键盘事件即可。
三、实现代码
监控全局鼠标事件的类为GlobalApplication,其中也实现了开启一个线程进行定时器计时,以及超时显示锁屏窗口的功能。
globalapplication.h 文件的内容如下:
#ifndef GLOBALAPPLICATION_H
#define GLOBALAPPLICATION_H
#include <QApplication>
#include <QMouseEvent>
#include <QThread>
#include <QTimer>
#include <QDebug>
#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()<<"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 Widget_Lock(static_cast<QWidget *>(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 实现超时锁屏的更多相关文章
- //四舍五入//得到倒序//比较字符串//拦截时间,实现超时锁屏//判断是否越狱//配置PodFile//Storyboard中跳转操作//处理不可逆的push界面操作
//处理不可逆的push界面操作 VerifyRealNameViewController *verifyRealNameCtrl = [VerifyRealNameViewController vi ...
- windows远程桌面3389超时锁定时间调整方法(取消锁屏时间限制)
我们在管理服务器操作时,有时候需要长时间操作服务器,有时候稍微离开下倒杯水或接个稍长点的电话,就超时断开了很烦啦!有没有方法解决这个问题类?答案是有的!我只要在组策略里面,稍微修改下超时时间就可以了. ...
- Qt - 锁屏界面加虚拟小键盘
一.实现效果 鼠标点击"密码输入栏",弹出虚拟键盘,输入锁屏密码后,点击虚拟键盘外部区域,则会隐藏虚拟键盘,再点击登录,成功进入主界面. 二.虚拟键盘-程序设计 2.1 frmNu ...
- qt qml 九宫格划指锁屏视图
九宫格划指锁屏视图Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2015-02 [先看效果] [下载] http://download.csdn. ...
- Android框架浅析之锁屏(Keyguard)机制原理
最近终于成功的摆脱了FM收音机,迈向了新的模块:锁屏.状态栏.Launcher---姑且称之为“IDLE”小组,或许叫手机 美容小组,要是能施展下周星星同学的还我漂漂拳,岂不快哉. OK,闲话打住,咱 ...
- Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法
Android-服务中监听电源键和Home键的广播 http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...
- 【填坑往事】Android手机锁屏人脸解锁优化过程实录
背景 写这篇文章,主要是为了以后面试方便.因为我简历上写了,上一份工作的最大亮点是将人脸解锁的速度由1200ms优化到了600ms,所以这些内容已经回答无数遍了.但每次总觉得回答的不完整,或者说总感觉 ...
- 调整Kali Linux的锁屏时间
调整Kali Linux的锁屏时间 锁屏是保护隐私的一种重要机制.当用户不操作电脑一段时间后,系统会进入锁屏状态.用户需要输入口令,才能重新进入系统.避免因为操作人员离开电脑后,被其他人员利用现有 ...
- Android锁屏后数据改变的解决方案
如果一个界面设置成横屏,那么锁屏再开启之后,会重新执行一遍onCreate()方法.对于这个问题的解决方案如下: 只需要在Menifest文件的activity相应标签下添加这行代码即可: andro ...
随机推荐
- mysql 查询数据库表信息,字段信息
#======================================================================= #查询表信息 select table_name, t ...
- C# vb .NET读取多个识别条形码线性条码
有时候,我们不确定数据源图片中到底有多少个条码,这些条码有可能是同一个类型的,也可能是不同类型的,如何在C#,vb等.NET平台语言里实现快速准确读取呢?答案是使用SharpBarcode! Shar ...
- 【翻译】Dockerfile参考
Dockerfile参考 来自docker官方网址:https://docs.docker.com/engine/reference/builder/ docker能够从Dockerfile中读取指令 ...
- 微服务架构 ------ Dockerfile定制镜像
Docker容器不仅仅是运行原生的容器,而是把我们的具体的项目能够布置到容器上面去,这就是Docker定制镜像需要做的事情. Docker容器 = new Docker镜像 镜像相当于类,容器相当 ...
- Linux操作系统的压缩、解压缩工具介绍
Linux操作系统的压缩.解压缩工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.compress/uncompress命令常用参数 Linux compress命令: ...
- TF-IDF算法介绍及实现
目录 1.TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是:TF ...
- 【HTTP】HTTP协议的请求与响应
创建时间:6.14 http协议 的位置 1.HTTP是什么 超文本传输协议(HyperText Transfer Protocol) 2.Http协议的组成 Http协议由Http请求和Http响应 ...
- vue使用swiper模块滑动时报错:[Intervention] Ignored attempt to cancel a touchmove event with cancelable=false, for example becaus
报错: vue报这个错 [Intervention] Ignored attempt to cancel a touchmove event with cancelable=false, for ex ...
- java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES) at com.mysql.c ...
- nginx 常用的中间件
1.--with-http_stub_status_module nginx客户端状态 # 打开default.conf文件 vim /etc/nginx/conf.d/default.conf # ...