文章目录
- 摘要
- QWidget
- QML
- 方法 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方面下手的,这里就可以用我上面的代码来实现了,包括我在项目中,实际也是使用上面的方式来实现的。这里就不用我在复制下俩吧。