成都网站建设设计

将想法与焦点和您一起共享

QML全局按键监视、拦截-创新互联

最近尝试使用Qt做android应用,一路不顺,满地都是坑,不过开发的应用不复杂,坑不算深,都一步步走过来了,唯独一个问题解决不了——Back按钮返回功能,不过今天总算解决了......

创新互联专注于保亭黎族企业网站建设,响应式网站建设,成都做商城网站。保亭黎族网站建设公司,为保亭黎族等地区提供建站服务。全流程按需策划,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

    用过QML的都知道,在QML里要处理按键就必须使用Keys附加属性,还要设置元素的focus属性为true,而且一旦focus变为了false(比如跳转到其他界面等),就再也无法处理按键消息了。

    在Qt fot Android中,Back按钮默认的实现是直接退出程序,而我的应用中使用了StackView来进行界面跳转,我希望Back能实现返回功能,且退出应用前有一个退出提示来确认,而不是直接退出。可是经过跳转界面和其他的操作,原来处理按键的Item很容易失去焦点,从而一按Back按钮就直接退出。

    那么有没有可以全局监控按键消息,通过拦截Back按键的消息来稳稳当当、一劳永逸地实现Back按钮返回功能呢?解决办法其实很简单,其实QML里很多类都有对应的C++类,如我所使用的ApplicationWindow,对应的C++类是QQuickWindow,既然是这样就好办了。如我们所知,在Qt C++里处理按键时间没那么多限制和顾虑,只管重载按键处理函数就行。于是我想,QML里按键事件都是从父级传到子级,那如果我在最上层的窗口类ApplicationWindow中把按键消息拦截下来,不就可以了吗?事实证明确实是可以的!

    具体的实现步骤如下:

    首先,实现一个简单的过滤器类。这个类必须继承自QObject或其子类,且我们只需重载一个虚函数eventFilter,事件过滤器的使用请参阅Qt相关文档。在eventFilter中我们可以来接我们想要的按键消息,比如我需要的Back按钮消息,其他一律放行。另外我还为拦截到的Back按钮消息定义了两个信号:backKeyPressed和backKeyReleased。

    实现过滤器后,先创建实例,并注册到QML属性当中:engine.rootContext()->setContextProperty(...),这样我们就可以直接在QML中连接过滤器中的Back按钮信号了。

   接着,在C++代码中找出顶层窗口实例。以使用QQmlApplicationEngine和ApplicationWindow为例,先设置QML中顶层窗口对象名(objectName属性),然后调用QQmlApplicationEngine的rootObjects方法,通过枚举返回值对比对象名找出顶层窗口实例。

    然后,当然是在窗口实例中安装我们过滤器实例,没错,就是之前书册到QML属性中的那个实例,这下所有的按键事件(当然还有其它的一些事件)在被处理前都要先被筛选一遍。

    最后,我们只需要在QML中连接backKeyPressed和backKeyReleased信号就能处理Back按钮了,再也不怕盼不来Back了......

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章标题:QML全局按键监视、拦截-创新互联
地址分享:http://chengdu.cdxwcx.cn/article/dhighe.html