Qt Qml 实现键鼠长时间未操作锁屏

news2024/12/27 7:22:38
头图

文章目录

    • 摘要
    • 实现思路
    • 键盘鼠标监控
      • 百度到的方法
      • 我的自己方法
    • 最后

关键字: QtQmlQInputEvent QStandardItemeventFilter

摘要

今日需求:

项目中需要实时检测用户是否长时间为操作键盘和鼠标,如果超过预设时间未操作键盘和鼠标,则退出到锁屏界面,准确的说是启动屏保,当用户再次操作键盘或鼠标,则进去登录界面,及实现长时间未操作键盘鼠标就锁屏的功能。

实现思路

image-20230510221701235

大致的实现想法如上图所示,就是启动一个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)

最后

因为是实际生产力业务代码,不方便暂时完整代码,仅分享一个思路供小伙伴们参考,如果哪里有不懂的地方或者疑问,可以直接留言问我就可以。


博客签名2021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/583147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux之管道

目录 Linux之管道 操作符号 作用 用法 管道符使用场合 匿名管道与命名管道的区别 如何创建命名管道 案例举例 案例1 --- 将/etc/passwd中的用户按UID大小排序 案例2 --- 统计出最占CPU的5个进程 案例3 --- 统计当前/etc/passwd中用户使用的shell类型 案例4 --- 统计网站…

Java大数据文件处理方法

前言 Java大数据文件处理是一种使用Java编写的大型数据处理技术&#xff0c;特别适用于处理大型数据文件。在这篇文章中&#xff0c;我们将了解什么是Java大数据文件处理&#xff0c;为什么它很重要以及Java大数据文件处理的方法和技术。 一、什么是Java大数据文件处理&#…

交易信号有效性测算1——N日涨跌幅

在交易信号发出后&#xff0c;我们需要一些程序化的流程&#xff0c;来验证信号的有效性&#xff0c;其中信号发出后N日的涨跌幅就是一个比较常见的任务 布林带交易策略 我们以布林带&#xff08;BOLL&#xff09;交易策略为示例&#xff1a; 中轨线 N日移动平均线上轨线 …

Linux 上的 .NET 崩溃了怎么抓 Dump

一&#xff1a;背景 1. 讲故事 训练营中有朋友问在 Linux 上如何抓 crash dump&#xff0c;在我的系列文章中演示的大多是在 Windows 平台上&#xff0c;这也没办法要跟着市场走&#xff0c;谁让 .NET 的主战场在工控 和 医疗 呢&#xff0c;上一张在 合肥 分享时的一个统计图…

Unity3D:项目 ID 不匹配的情况下如何应对

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 如果在 Services 窗口的 Settings 中找不到项目 ID&#xff0c;或者如果发现项目 ID 不匹配&#xff0c;这可能是因为使用了较早版本的 Unity 来升级项目&#xff0c;或在脱机时创建…

Win10电脑应用程序并行配置不正确怎么办?

Win10电脑应用程序并行配置不正确怎么办&#xff1f;有用户在运行某些软件时&#xff0c;突然提示出错信息“应用程序无法启动&#xff0c;因为应用程序的并行配置不正确&#xff0c;出现这一问题可能是禁用本地相关服务&#xff0c;或者新安装的系统缺少必要的VC 运行。那么具…

PTQ-PDPMV1 PROSOFT DP主网络接口模块

Quantum的PROFIBUS DP主网络接口模块 PTQ-PDPMV1 PROFIBUS DP主网络接口允许Quantum处理器与支持PROFIBUS DP V0或V1的从设备轻松连接。该模块作为PROFIBUS网络和处理器之间的输入/输出模块。PROFIBUS是工业自动化中最常用的协议之一。应用领域包括电力和配电、石化、水和天然…

基于stm32mp157 linux开发板ARM裸机开发教程7:Cortex-A7 GPIO 实验(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

如何在命令行编译运行java程序?

2023年5月29日&#xff0c;周一下午&#xff1a; 好久没写java程序了&#xff0c;今天居然忘了怎么用命令行编译运行java程序了&#xff0c;还好后来想起来了&#xff0c;为了避免忘记&#xff0c;写篇博客记录一下 1、先用记事本等编辑器写一个java程序&#xff0c;文件名要和…

网络货运系统源码 网络货运平台源码,货运APP源码 货物运输管理源码

网络货运系统源码 网络货运平台源码&#xff0c;货运APP源码 货物运输管理源码 网络货运为无车承运人更名而来&#xff0c;网络货运平台的好处可以节省找车找货的时间与成本。根据国家对智慧物流行业的发展规划&#xff0c;及《网络平台道路货物运输经营管理办法》等相关法律法…

github创建仓库和拉取代码

目录 一、git创建仓库 第一步&#xff1a;首先登录github 第二步&#xff1a;进入建立的仓库(或者新建仓库) 第三步&#xff1a;创建成功 第四步&#xff1a;在本地新建一个文件夹&#xff0c;然后在文件夹下打开git bash 第五步&#xff1a;在git bash命令框执行git init…

Linux:centos:修改临时ip永久ip

使用 ifconfig 查看网卡信息以及ip 临时配置ip 找到要修改ip的网卡的名称&#xff08;我这里使用名称为&#xff1a;ens33网卡&#xff09; # ifconfig 网卡名 ip /子网掩码 ifconfig ens33 192.168.1.2/24 配置永久ip 去配置网卡文件 vi /vim 或 nano vim /etc/s…

腾讯云轻量服务器和云服务器区别(超详细全解析)

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器成本低&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CVM适…

10 个对于Android开发者有用的Kotlin扩展函数#1

10 个对于Android开发者有用的Kotlin扩展函数 使用扩展函数来提高安卓开发体验 什么是扩展功能&#xff1f; Kotlin 中的扩展函数允许您向现有类添加新功能&#xff0c;而无需继承它或修改类本身。这是从类定义外部扩展类功能的便捷方式。 Log 您可以any object使用此扩展…

【ABAQUS】什么是剪切闭锁?剪切闭锁会导致什么?

“完全积分”是指当单元具有规则形状时&#xff0c;对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素&#xff0c;“规则形状”意味着边缘是直的&#xff0c;并以直角相交&#xff0c;任何边缘节点都位于边缘的中点。 完全积分的线性元素在每个…

6种常见电流检测电路设计方案

电流检测电路设计方案&#xff08;一&#xff09; 低端检流电路的检流电阻串联到地&#xff08;图1&#xff09;&#xff0c;而高端检流电路的检流电阻是串联到高电压端&#xff08;图2&#xff09;。两种方法各有特点&#xff1a;低端检流方式在地线回路中增加了额外的线绕电…

正则表达式快速上手

一、推荐个正则表达式练习网站&#xff1a;regex101: build, test, and debug regexhttps://regex101.com/ 二、正则表达式常用的几个符号 &#xff08;一&#xff09;限定符 1. &#xff1f;&#xff1a; 表示匹配的字符串中&#xff0c;&#xff1f;前面的字符可有可无&a…

VUE3.0 路由跳转之后页面停留在上一个浏览页面位置不会回到顶部问题

方式一&#xff1a;普通用法&#xff0c;vue2.0也可用 // 一般方式路由拦截 export default {// 组件守护器beforeRouteEnter(to, from, next) {// A跳转到B&#xff0c;B页面停留在A页面的滚动位置&#xff1b;解决方法&#xff1a;将scrollTop设置为0window.scroll(0, 0);ne…

使用docker部署mysql的主从复制

前言&#xff1a; 客户需要数据库做一个备份&#xff0c;所以这次部署mysql的主从复制&#xff0c;由于测试原因两个mysql服务都安装在一台服务器上&#xff0c;实际部署中一般分开部署。 介绍&#xff1a; 用途&#xff1a; 实时灾备&#xff0c;用于故障切换读写分离&…

excel常用操作

1 基础操作 1.1 冻结首行 选中需要冻结的行&#xff0c;视图--冻结窗格&#xff0c;从而使其固定显示。