主页 > 人工智能  > 

Qt防止程序退出

Qt防止程序退出

文章目录 摘要QWidgetQML方法 1方法 2 关键字: Qt、 eventFilter、 Close、 键盘、 任务管理器

摘要

今天要聊得内容还是怎么防止别人关闭我的程序,之前都是在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方面下手的,这里就可以用我上面的代码来实现了,包括我在项目中,实际也是使用上面的方式来实现的。这里就不用我在复制下俩吧。


标签:

Qt防止程序退出由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Qt防止程序退出