Qt 防止程序退出

news/2025/1/3 4:28:17/
头图

文章目录

    • 摘要
    • QWidget
    • QML
      • 方法 1
      • 方法 2

关键字: QteventFilterClose键盘任务管理器

摘要

今天要聊得内容还是怎么防止别人关闭我的程序,之前都是在win下面,一般都是用过钩子连捕获键盘事件,完了吧对应的事件忽略,但是这个不能夸平台,所以我就在想有没有一个稍微通用点的方法。

今天我尝试的方法是从Qt 下手,来想法解决这个问题。但是从Qt出发的话,解决的只能是程序本身,而系统还是无法屏蔽的。只能是防止别人意外按到 alt + F4结束程序,而无法做到不让别人结束程序。当然,它有可能自己就结束了,哈哈哈。

QWidget

传动的QWidget,这里我能想到的就是重载关闭函数,但是这个太低级了,所以我还是用了一个更好玩的方法,那就是Qt 的事件过滤器eventFilter

首先,我们需要注册全局事件过滤器,代码如下:

QApplication::instance()->installEventFilter(this);

完了就是重载eventFilter函数了。

声明

    bool eventFilter(QObject *obj, QEvent *event) override;

实现

bool Turing_KeyMouseMonitor::eventFilter(QObject *obj, QEvent *event)
{/*** 捕获键盘事件**/if(event->type() == QEvent::KeyPress || event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonPress){m_lockScreenTimer->start(m_timerLong);setLockScreen(false);}
#ifdef QT_NO_DEBUG/*** 禁止正常关闭程序**/if(event->type() == QEvent::Close)event->ignore();
#endifreturn QObject::eventFilter(obj,event);
}

这里重点就是下面的部分

    if(event->type() == QEvent::Close)event->ignore();

将关闭时间忽略。

这里我贴心的为了方便调试,在Debu模式下,是不忽略关闭事件的,只有在我们发布时使用release模式编译才会。

QML

轮到QML,记得自己在17年哪会玩QML 的时候,哪会资料是真的少,现在在来玩QML,能找的的资料已经很多了,最近在Bilibili大学上面都有好多quick的教程了,看来QML 这几年的发展也是不错的。

方法 1

其实QML下的基本原理和QWIdget基本一致,既然从Qt 下手,那就基本还是只能解决程序问题,无法解决系统问题。所以在QML下面,基本思想还是重写关闭事件,

代码如下

    /*防止客户主动关闭程序*/onClosing:{close.accepted = false}

其实正常在用户触发关闭事件的时候,应该礼貌的提示客户,他触发了关闭事件,是他无意的,还是就是想关闭程序,但是这个也要分场合,比我我们的程序最总是泡在机器设备上的,我们是不希望客户看到我们除了程序以外的其他的东西的,看考那些数控车床,基本上是不是开机就是程序,程序关闭,也就是关机了,没有可以退出程序的吧,所以这里我是没有弹窗提示的,当然不是不能做,只是我这里不需要。

方法 2

这是充QML界面层来解决这个问题,还是可以从CPP方面下手的,这里就可以用我上面的代码来实现了,包括我在项目中,实际也是使用上面的方式来实现的。这里就不用我在复制下俩吧。


博客签名2021

http://www.ppmy.cn/news/29593.html

相关文章

【ElasticSearch8.X】学习笔记(二)

【ElasticSearch8.X】学习笔记四、基础操作4.1、索引操作4.1.1、创建索引4.1.2、查询指定索引4.1.3、查询所有索引4.1.4、 删除索引4.2、文档操作4.2.1、创建文档4.2.2、查询文档4.2.3、修改文档4.2.4、删除文档4.2.5、查询所有文档4.3、数据搜索4.3.1、匹配查询文档4.3.2、匹配…

以下真的没有任何要写的了,我需要凑字数,请大家原谅

以下真的没有任何要写的了,我需要凑字数,请大家原谅!!!!!!!!!!!!!!!&#…

进程的介绍

文章目录一.进程的概念1.1概念1.2进程的组成1.2.1 PCB中描述进程的特征二.进程的虚拟地址空间三.进程间的通信引入线程一.进程的概念 1.1概念 百科的介绍: 换句话说,一个跑起来的程序,就是一个进程,也就是在操作系统中运行的exe程序就是一个进程,如下图的进程列表 进程是操…

abap MODIFY常用语法解析

MODIFY 是既可以操作数据又可以操作内表的一个语法, 实现的逻辑都一样. 如果你内表或数据库中存在该行数据会对该行数据进行更新. 如果不存在,就会插入数据. , 1.如果it_tab是带有标题行的内表,是可以忽略FROM wa_tab工作区的 MODIFY it_tab .2.把工作区wa_tab中的数据更新…

DCDC/LDO Auto-Discharge

1、概念 When using a capacitor with large capacity value in VOUT side, the VOUT pin voltage might not immediately fall to the ground level when the EN(CE,CONTROL) pin is switched from the active mode to the standby mode. By adding N-channel transistor to …

2023-3-2 刷题情况

迷宫 题目描述 这天, 小明在玩迷宫游戏。 迷宫为一个 nn 的网格图, 小明可以在格子中移动, 左上角为 (1,1), 右 下角 (n,n) 为终点。迷宫中除了可以向上下左右四个方向移动一格以外, 还有 m 个双向传送门可以使用, 传送门可以连接两个任意格子。 假如小明处在格子 (x1,y1)(…

Nginx 通过 header 中的标识进行分发

Nginx可以根据请求头中自定义的标识将请求分发到不同的服务器。具体来说,可以使用map指令将请求头中的自定义标识映射为不同的后端服务器地址,然后使用proxy_pass指令将请求转发到对应的后端服务器。 以下是一个示例配置文件: http {map $h…

paddle 50 将EIOU、WIoU、SIoU嵌入paddledetection中,并用于ppyoloe的训练

性能先进的模型并不一定在整体上都是最先进的,就如在目前所公开的最强目标检测模型ppyoloe+[yolov8虽然是最新一代模型,其使用CIoU做box loss,在公开coco上的指标是不如ppyoloe+,这应该是由于object365数据集的加持]使用GIOU作为loss来进行框回归优化([这两个模型除了iou …