Qt Qml 实现键鼠长时间未操作锁屏
文章目录
- 摘要
- 实现思路
- 键盘鼠标监控
- 百度到的方法
- 我的自己方法
- 最后
关键字:
Qt、
Qml、
QInputEvent 、
QStandardItem、
eventFilter
摘要
今日需求:
项目中需要实时检测用户是否长时间为操作键盘和鼠标,如果超过预设时间未操作键盘和鼠标,则退出到锁屏界面,准确的说是启动屏保,当用户再次操作键盘或鼠标,则进去登录界面,及实现长时间未操作键盘鼠标就锁屏的功能。
实现思路

大致的实现想法如上图所示,就是启动一个QTimer定时器,输入参数就是要规定的微操作时间,如果到时间,没有检测到键盘和鼠标的操作,就出发屏幕保护程序,接着持续监听,如果依旧为监测到键盘和鼠标操作,那就一直停留在屏保画面,如果有键盘或鼠标操作,那就进入到登录界面。如果检测到了键盘或鼠标操作,那就重置定时器,是定时器重新开始计时。
题外话:
这里因为我的时间是一个大致的时间范围,对时间的精确是要求其实没有多高,所以这里就直接使用了QTimer,但是Qt的定时器,那精确性是出了名的,所以在对精确性要求比较高的场景下,可以使用其他方式实现定时器,而不用Qt自带的定时器。
键盘鼠标监控
百度到的方法
这个就有好多了, 可知直接重写键鼠事件,这个网上一大堆,示例代码如下:
class MyWidget : public QWidget {
public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); } void handleMousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { // 处理鼠标左键按下事件 } else if (event->button() == Qt::RightButton) { // 处理鼠标右键按下事件 } else if (event->button() == Qt::MiddleButton) { // 处理鼠标中键按下事件 } } void handleMouseMoveEvent(QMouseEvent *event) override { // 处理鼠标移动事件 } void handleMouseReleaseEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { // 处理鼠标左键释放事件 } else if (event->button() == Qt::RightButton) { // 处理鼠标右键释放事件 } else if (event->button() == Qt::MiddleButton) { // 处理鼠标中键释放事件 } } void handleKeyPressEvent(QKeyEvent *event) override { if (event->key() == Qt::Key_Space) { // 处理空格键按下事件 } else if (event->key() == Qt::Key_Enter) { // 处理回车键按下事件 } else if (event->key() == Qt::Key_Backspace) { // 处理退格键按下事件 } } private: QPoint lastPos_{};
};
或者使用QInputEvent 和QStandardItem ,示例代码如下:
监测键盘事件:
void MainWindow::on_pushButton_clicked() { QStandardItem *standardItem = new QStandardItem("0"); table->appendRow(standardItem); connect(table->model(), &QTableModel::rowInserted, this, &MainWindow::updateNum);
}void MainWindow::updateNum(const QModelIndex &index) { if (index.row() == 0) { QStandardItem *standardItem = static_cast<QStandardItem*>(index.internalPointer()); connect(standardItem, &QStandardItem::textChanged, this, [=]() { qDebug() << "Key released: " << standardItem->text(); }); }
}
监测鼠标事件:
void MainWindow::on_pushButton_clicked() { QStandardItem *standardItem = new QStandardItem("0"); table->appendRow(standardItem); connect(table->model(), &QTableModel::rowInserted, this, &MainWindow::updateNum);
}void MainWindow::updateNum(const QModelIndex &index) { if (index.row() == 0) { QStandardItem *standardItem = static_cast<QStandardItem*>(index.internalPointer()); connect(standardItem, &QStandardItem::textChanged, this, [=]() { qDebug() << "Mouse released: " << standardItem->text(); }); }
}
我的自己方法
但是上面都不是我想要的,还是太复杂,我仅仅想要的就是检测键盘和鼠标操作,至于操作了什么,我并不关心。所以我开辟的新的方法。我这里使用了Qt 的事建过滤器eventFilter
1 首先安装全局事件过滤器
这我们需要给我们的QApplication安装事建过滤器,代码如下
QApplication::instance()->installEventFilter(this);
2 在事件过滤器中监听键盘事件和鼠标事件
我们在事件过滤器中只需要比较事件是否为键盘事件或鼠标事件,代码如下:
/*** 捕获键盘事件**/if(event->type() == QEvent::KeyPress || event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonPress){m_lockScreenTimer->start(m_timerLong);setLockScreen(false);}
如上述代码,我监听了键盘按下事件、鼠标移动事件和鼠标按键按下事件。并且在监听到这三个事件中的其中一个的时候,就重置了定时器,并且锁屏标志位置位了false
3 实现定时器到时间触发锁屏信号
connect(m_lockScreenTimer,&QTimer::timeout,this,[=](){setLockScreen(true);m_lockScreenTimer->stop();});
上述代码,如果到达预定时间,这触发对应的槽函数,这里我懒得写个函数了,直接使用了Lambda表达式,主要就是把锁屏标志位置位true,
4 使用Qt的属性系统
因为我参与的项目实际是QML项目,所以这里就能体现所Qt属性系统的香了,可以直接和QML 中的属性做无缝绑定。代码如下:
Q_PROPERTY(bool lockScreen READ lockScreen WRITE setLockScreen NOTIFY lockScreenChanged)
最后
因为是实际生产力业务代码,不方便暂时完整代码,仅分享一个思路供小伙伴们参考,如果哪里有不懂的地方或者疑问,可以直接留言问我就可以。

相关文章:
Qt Qml 实现键鼠长时间未操作锁屏
文章目录 摘要实现思路键盘鼠标监控百度到的方法我的自己方法 最后 关键字: Qt、 Qml、 QInputEvent 、 QStandardItem、 eventFilter 摘要 今日需求: 项目中需要实时检测用户是否长时间为操作键盘和鼠标,如果超过预设时间未操作键盘和…...
常用的数字高程模型(DEM)数据介绍,附免费下载
常用的数字高程模型(DEM)数据: ETOPO(1.8千米) ETOPO是一种地形高程数据,由NGDC美国地球物理中心发布,与大多数高程数据不同的是,它还包含海底地形数据。 SRTM15(450…...
字节跳动面试挂在2面,复盘后,决定二战.....
先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,字节的游戏专场又是最早开始的,就投递了…...
简述熔断、限流、降级
高并发场景指的是在大量用户同时访问服务时,服务能够保持稳定和高效运行的能力。 常用的解决高并发场景下服务不可用问题的技术手段包括熔断、限流和降级: - 熔断:当服务的错误率超过一定阈值时,熔断器会自动断开服务的调用&…...
Maven 工具
Maven 工具 Maven简介Maven 基础概念创建 Maven项目依赖配置生命周期与插件分模块开发聚合和继承聚合继承聚合与继承的区别 属性版本管理多环境配置与应用私服 Maven简介 Maven 本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM…...
iptables扩展匹配条件
文章目录 1. multiport模块2. iprange模块3. string模块4. time模块5. icmp模块6. connlimit模块7. limit模块8.tcp扩展模块9.state模块10 Iptables自定义链1.1 为什么要使用自定义链1.2 创建自定义链1.3 引用自定义链1.4 重命名自定义链1.5 删除自定义链 1. multiport模块 常…...
直播录音时准备一副监听耳机,实现所听即所得,丁一号G800S上手
有些朋友在录视频还有开在线会议的时候,都会遇到一个奇怪的问题,就是自己用麦克风收音的时候,自己的耳机和别人的耳机听到的效果不一样,像是音色、清晰度不好,或者是缺少伴奏以及背景音嘈杂等,这时候我们就…...
回归测试最小化(贪心算法,帕累托支配)
回归测试最小化(贪心算法,帕累托支配) 介绍 有时我们不能只是重新运行我们的测试(例如,当我们 换界面)。 回归测试可能很昂贵: (1)一些公司通宵运行回归测试套件。 (2) 对于嵌入式系统,我们可能必须测试正在使用的软件࿰…...
Python系列模块之标准库shutil详解
感谢点赞和关注 ,每天进步一点点!加油! 目录 一、shutil介绍 二 、使用详解 2.1 复制函数 2.1.1 shutil.copy 2.1.2 shutil.copy2 2.1.3 shutil.copyfile 2.1.4 shutil.copytree 2.2 移动文件 2.2.1 shutil.move 2.3 删除文件 2.3…...
pb如何播放Flash
---- Flash动画不仅包含动画,还可有声音、超文本连接,同时由于它是矢量格式文件,生成的这种包含动画、声音等的文件(*.swf)很小,非常适 合在网络上传输使用,因而在当前Web网页技术中得到很快发展。本文讨论在PowerBuilder6.5数据库编程中用Flash4提供的控件"Swflas…...
独立成分分析ICA
独立成分分析 ICA 1. 算法原理简介2.源信号与混合信号的差异2.1 独立性 Independence2.2 高斯性 Normality2.3 复杂性 Complexity 3.非高斯性的度量3.1 峭度 Kurtosis 参考文献 blind source separation (BSS) 1. 算法原理简介 mixing得到signal mixture过程: x 1…...
从零开始之如何在React Native中使用导航
好的,让我们开始学习如何在React Native中使用导航。 安装React Navigation 首先,你需要安装React Navigation库。在项目文件夹中打开终端窗口,并运行以下命令: npm install react-navigation/native 或者 yarn add react-nav…...
RAW、RGB 、YUV三种图像格式理解
文章目录 1. 背景2. 相关概念2.1 颜色与色彩空间2.2 RAW图像2.3 RGB图像2.4 YUV图像 3. 分类简图 RAW、RGB 、YUV三种图像格式理解 1. 背景 在工作中,经常听到用来描述图像格式的RAW,RGB与YUV,但一直没有系统的进行了解,处于局部认…...
关于对【mysql存储过程】的理解与简述
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/130857854 出自【进步*于辰的博客】 【存储过程】这个知识点,我在大二下期学习【mys…...
贪吃蛇游戏的制作记录
关于蛇的实现代码 #include "snake.h" #include "globalvar.h" #include <graphics.h> int fangXiang 1;//方向 0 右 1 上 2 左 3 下 int snakeHang[100] { 10,11,12,13,14 };//蛇 每节所在行 int snakeLie[100] { 10,10,10,10,10 };//蛇 每节所…...
Go基础入门
Go是一种现代的、高效的、开源的编程语言,由Google开发。它的语法简洁、易于学习和使用,支持并发编程,特别适合构建网络应用和分布式系统。本篇文章将介绍Go语言的基础语法和常用特性,帮助初学者快速入门。 一、Go语言的基础语法…...
JavaScript教程(二)
BOM浏览器对象模型 什么是BOM BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window;BOM由一系列相关的对象构成,并且每个对象都提供了很多方…...
设计模式之代理模式
代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问。 因为代理类与服务类实现同样的接口,所以代理类能代替服务类提供给客户端。当客户端使用代理类时,代理类能对请求进行处理(例如增加访问控制、缓存请求结果、隐…...
初识MySQL
💕与其抱怨生活的不公,不如积极行动改变它。💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 🚗本文章主要内容:简单了解什么是MySQL、MySQL的发展…...
内网渗透(八十五)之ADCS证书服务攻击
ADCS证书服务攻击 漏洞背景 2021年6月17日,国外安全研究员 Will Schroeder 和 Lee Christensen 共同发布了针对ADCS(Active Directory Certificate Service, 活动目录证书服务)的攻击手法。同年8月5日,在Black Hat 2021上 Will Schroeder 和 Lee CHristensen 对该攻击手法进…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
