首页 > 其他分享 >QML全局按键监视、拦截

QML全局按键监视、拦截

时间:2023-01-31 22:45:08浏览次数:33  
标签:按键 Back 实例 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了......

https://blog.51cto.com/bran101/1825258

标签:按键,Back,实例,QML,按钮,过滤器,拦截
From: https://www.cnblogs.com/im18620660608/p/17081079.html

相关文章

  • QML实现换肤(主题样式切换)
    QtQuick没有像QtWidgets那样的QSS样式表机制,只能通过自定义组件或者设置Controls主题来实现样式定制。目前网上搜到的换肤功能,大多是定义一个全局的样式文件,在自定......
  • 字符设备驱动-3.gpio驱动(按键中断)
    APP读取按键查询方式休眠-唤醒方式poll方式异步通知方式第2、3、4种方法,都涉及中断服务程序。查询方式APP调用open时,导致驱动中对应的open函数被调用,在里......
  • P1020 [NOIP1999 普及组] 导弹拦截
    [NOIP1999普及组]导弹拦截题目描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以......
  • Qt 按键添加图标
    1、开发环境:Qt5.12.2,QtCreate4.8.22、直接上代码/*按键上背景*/QPixmappixmap(":/Resourses/images/easyicon_net.png");QPixmapfitpixmap=pixmap.......
  • 【转载】【SSM】SpringBoot 统一功能处理,(*Spring 拦截器实现与原理)
    ✨1.用户登录权限效验1.1最初用户登录验证1.2SpringAOP用户统一登录验证的问题1.3Spring拦截器1. 自定义拦截器2.将自定义拦截器加入到系统配置1.4拦截器实......
  • Qml类型:State 状态
    Qml类型:State状态1、定义一个状态2、状态名称3、绑定目标4、触发状态改变我们来写一个状态转换器。1、定义一个状态一个状态的定义可以声明为states:State{...},也......
  • Qml中使用动画Animation
    Animation是Qml中所有动画类的基类。Qml中动画的分类PropertyAnimation:改变控件的属性来产生动画。NumberAnimation:专门改变数字类型的动画,效率优于PropertyAnimation......
  • Fitter-细节-过滤器拦截方式配置 Fitter-细节-过滤器链(多个过滤器)
    Fitter-细节-过滤器拦截方式配置  拦截方式配置:资源被访问的方式注解配置:设置dispatcherTypes属性1.REQUEST:默认值。浏览器直接请求资源......
  • vue3实现禁用物理按键返回,但是可以通过自定义app-bar的返回按钮返回
    1.注意app-bar是一个所有页面都会用到的顶部title栏,里面左侧有返回按钮;2.基于1,在app-bar组件的setup里添加这个代码:onMounted(()=>{//不能少history.pu......
  • Fitter-细节-过滤器拦截路径配置
    Fitter-细节-过滤器拦截路径配置1.具体资源路径:/index.jsp只有访问index.jsp资源时,过滤器才会被执行2.拦截目录:/user/*访问/user下的所有资源时,过滤器都会被执行3......