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 ...
随机推荐
- C# 打开mpp文件(Microsoft object)问题总结
有需求就有解决方案,早上还没有听说过什么是 mpp 文件,下午已经能成功的将功能实现,这难道就是程序员的职业素养?哈哈哈哈 从网上找了很多方法,最后自己找到一个十分简单的打开 mpp 文件的方法: p ...
- SpringBoot 整合MyBatis 统一配置bean的别名
所谓别名, 就是在mappper.xml配置文件中像什么resultType="xxx" 不需要写全限定类名, 只需要写类名即可. 配置方式有两种: 1. 在 applicatio ...
- git的clone
在使用git来进行版本控制时,为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s):/ ...
- 字符串的sizeof长度及strlen长度
在C/C++中,字符串是以零('\0')结尾的.比如,对于下面的字符串: "hello" 在最后一个字符'd'后面,还有一个我们肉眼看不见的'\0'字符,作为该字符串的结束符.所 ...
- CRM product model的用法
User scenario An example from sap help For a car, the interior, the engine capacity, and the exterio ...
- 本机安装mysql步骤
原文:https://www.cnblogs.com/dukeShi/p/6546024.html 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具) 因为这段时间不是装系统就是 ...
- SpringBoot全局Jackson配置未生效
在做一个小项目,后台服务第一次用SpringBoot构建.接口使用Json格式,在application.properties中配置如下: spring.jackson.default-propert ...
- JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(四)
未完待续 ........ 前言: 加班了好几天,终于结束上一个坑的项目了,项目交接人员全部离职,代码一行注释没有,无人问津的情况下,完成了项目,所以好的规范真的很重要. 继续日期改写 一 ...
- BZOJ4241:历史研究(回滚莫队)
题意:给定N个数字,Q次询问,询问这个区间的最大加权众数是多少. 加权众数是指出现次数*数字大小.N,Q<1e5. 思路:不难发现可以N*sqrtN*logN的思路做,但是应该过不了. 这个Ns ...
- encodeURIComponent() 函数可把字符串作为 URI 组件进行编码
语法 encodeURIComponent(URIstring) 参数 描述 URIstring 必需.一个字符串,含有 URI 组件或其他要编码的文本. 返回值 URIstring 的副本,其中的某 ...