最近使用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中监控全局键盘鼠标事件

Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态

Qt——线程与定时器

Qt 实现超时锁屏的更多相关文章

  1. //四舍五入//得到倒序//比较字符串//拦截时间,实现超时锁屏//判断是否越狱//配置PodFile//Storyboard中跳转操作//处理不可逆的push界面操作

    //处理不可逆的push界面操作 VerifyRealNameViewController *verifyRealNameCtrl = [VerifyRealNameViewController vi ...

  2. windows远程桌面3389超时锁定时间调整方法(取消锁屏时间限制)

    我们在管理服务器操作时,有时候需要长时间操作服务器,有时候稍微离开下倒杯水或接个稍长点的电话,就超时断开了很烦啦!有没有方法解决这个问题类?答案是有的!我只要在组策略里面,稍微修改下超时时间就可以了. ...

  3. Qt - 锁屏界面加虚拟小键盘

    一.实现效果 鼠标点击"密码输入栏",弹出虚拟键盘,输入锁屏密码后,点击虚拟键盘外部区域,则会隐藏虚拟键盘,再点击登录,成功进入主界面. 二.虚拟键盘-程序设计 2.1 frmNu ...

  4. qt qml 九宫格划指锁屏视图

    九宫格划指锁屏视图Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2015-02 [先看效果] [下载] http://download.csdn. ...

  5. Android框架浅析之锁屏(Keyguard)机制原理

    最近终于成功的摆脱了FM收音机,迈向了新的模块:锁屏.状态栏.Launcher---姑且称之为“IDLE”小组,或许叫手机 美容小组,要是能施展下周星星同学的还我漂漂拳,岂不快哉. OK,闲话打住,咱 ...

  6. Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法

    Android-服务中监听电源键和Home键的广播  http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...

  7. 【填坑往事】Android手机锁屏人脸解锁优化过程实录

    背景 写这篇文章,主要是为了以后面试方便.因为我简历上写了,上一份工作的最大亮点是将人脸解锁的速度由1200ms优化到了600ms,所以这些内容已经回答无数遍了.但每次总觉得回答的不完整,或者说总感觉 ...

  8. 调整Kali Linux的锁屏时间

    调整Kali Linux的锁屏时间   锁屏是保护隐私的一种重要机制.当用户不操作电脑一段时间后,系统会进入锁屏状态.用户需要输入口令,才能重新进入系统.避免因为操作人员离开电脑后,被其他人员利用现有 ...

  9. Android锁屏后数据改变的解决方案

    如果一个界面设置成横屏,那么锁屏再开启之后,会重新执行一遍onCreate()方法.对于这个问题的解决方案如下: 只需要在Menifest文件的activity相应标签下添加这行代码即可: andro ...

随机推荐

  1. ABP——切换MySQL数据库

    我是一名.net新手,应公司要求开始学习.net,使用的是土耳其大牛写的框架ASP.NET Boilerplate 简称ABP,是基于DDD的现代ASP.NET开发框架,ABP提供了一个启动模板用于新 ...

  2. c# 项目nuget不自动安装dll

    问题 创建的项目提交到服务器上,其他人下载项目后无法生成解决方案成功,无法自动生成dll,无法自动下载安装相应的插件 解决方案 删除packages文件夹即可,nuget就可以自动安装相关的dll了

  3. 《EOPL》 : CPS风格真是神奇

    计算的栈好像可以随便跳转了一样. Exception 的 try/catch , resume机制都可以借此实现 还可以实现 Erlang中的 spawn,线程调度器,以及基本的 Mutex 同步机制

  4. java包装类和值类型的关系

    java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long fl ...

  5. PAT 1026程序运行时间

    PAT 1026程序运行时间 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间 ...

  6. ArrayList与LinkedList

    ArrayList与Linkedlist的增删改查问题以及集合选择问题 线程:安全:Vector 不安全:ArrayList,LinkedList 增删多:LinkedList 查询多:ArrayLi ...

  7. Linux文本编辑器的常用命令

    Vi文本编辑器 首先介绍命令模式,命令模式是在进入文本编辑器的时候的当前状态:输入模式(插入模式)是在插入文本时候按下的键,比如 大小 i  键,a键.o键:底行模式是在命令模式的状态直接输入冒号 & ...

  8. 04——Solr学习之项目中使用solr

    借鉴博客:https://blog.csdn.net/kisscatforever/article/details/76744768 完全可以跟着他这个来,清晰明了. 一.来说说怎么使用solr这玩意 ...

  9. Centos7 安装配置 Rabbitmq Cluster

    Rabbitmq介绍 RabbitMQ是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能.健壮以及可伸缩性出名的 ...

  10. A simple introduction to Three kinds of Delegation of Kerberos

    1.What is Delegation? Just like the name. Delegation is that a server pretend to behalf of a user an ...