当前位置: 首页 > news >正文

Qt 防止程序退出

头图

文章目录

    • 摘要
    • 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();
#endif
    return 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

相关文章:

  • Vector - CAPL - 简介及数据结构
  • 北京移动CM311-5s-ZG_GK6323V100C_2+8_免拆一键卡刷固件包
  • 2022年考研结果已出,你上岸了吗?
  • Java中常用的七种队列你了解多少?
  • 【YOLO系列】YOLOv5超详细解读(网络详解)
  • Git系列:常见报错处理
  • Java 操作图片进行缩放旋转翻转加水印
  • π型滤波器 计算_π型滤波电路
  • 【OJ比赛日历】快周末了,不来一场比赛吗? #03.04-03.10 #12场
  • 数据结构:堆的实现与建堆时间复杂度分析
  • 90%的人都不算会爬虫,这才是真正的技术,从0到高手的进阶
  • Spring Boot 3.0系列【5】基础篇之应用配置文件
  • 数据结构六大排序
  • IPv4地址细讲
  • 植物大战 二叉搜索树——C++
  • RV1126 在Ubuntu18.04开发环境搭建
  • 如何根据IP地址判断是IPv4还是IPv6
  • js几种对象创建方式
  • Android TV UI开发常用知识
  • 【解锁技能】学会Python条件语句的终极指南!
  • 市民建议公交广播增加“请勿大声喧哗”提示,上海交通委回复
  • 白兰花香飘京城,上海文化体验项目点亮中华民族共同体之美
  • 腾讯启动史上最大就业计划:三年新增2.8万个校招实习岗位,今年技术岗位占六成
  • TP-LINK4.36亿元竞得上海青浦徐泾办公地块,需引入全球领先的总部型企业
  • 习近平抵达柬埔寨首都金边
  • 新疆大学迎来新校长