首页 > 其他分享 >Qt键盘事件检测不到方向键|阻止控件截取键盘事件

Qt键盘事件检测不到方向键|阻止控件截取键盘事件

时间:2024-08-22 16:15:56浏览次数:8  
标签:控件 方向键 键盘 Right 事件 Key

做项目二次开发的时候遇到一个问题,在自己新建的界面中放了很多控件,需要通过键盘方向键来控制焦点在不同控件间的转移,之前用键盘事件检测上下键没有问题,后来加上左右键发现没有反应,查了资料了解到是控件吞掉了左右方向键的信号,因为Qt中本身就有一些处理事件的函数,控件会获取键盘左右方向键的信号,信号被控件获取之后自定义的事件就获取不到了,以下是尝试过的两种方法

解决方法1:直接阻止所有控件获取键盘信号-grabKeyboard()

grabKeyboard()大致功能是阻止控件获取键盘信号,这样自定义键盘事件就能获取到方向键了,直接在构造函数里加上:

this->grabKeyboard();

但是又出现了新的问题,这会导致需要键盘输入的控件例如Line Edit之类的无法输入,于是需要另一个函数 releaseKeyboard()

这个函数的大致功能是释放键盘信号,让控件能够重新获取到键盘信号

在检测到要从键盘向控件输入的时候加上

this->releaseKeyboard();

让控件获取键盘信息,输入结束后立刻grabKeyboard(),这样在自己新建的界面里就没有问题了

然后又发现了问题,我写的代码只是整个项目的一小部分,整个项目有很多界面很多控件,项目运行之后一旦进入我写的界面,grabKeyboard()就会一直生效,直到遇到releaseKeyboard(),而其它界面里是没有releaseKeyboard()的,这就导致其它界面里的输入控件无法输入,直接去改其他界面的代码不太可行,这个方法可能不太适用多人合作的大项目

解决方法2:事件过滤器

这个方法其实在前面方法一之前就试过了,但是因为一个枚举成员没用好导致我以为这个方法不行

在学事件过滤器的时候知道事件过滤器可以截取指定信号,被截取的信号就不会传给控件,所以事件过滤器应该是在控件之前获取信号的

首先在头文件里声明

1 public slots:
2     bool eventFilter(QObject *, QEvent *);

然后根据需求定义函数

 1 bool WgDemo::eventFilter(QObject *watched, QEvent *event)
 2 {
 3     if (event->type()==QEvent::KeyPress)
 4     {
 5         qDebug()<<"press";
 6         QKeyEvent *keyevent=static_cast<QKeyEvent *>(event);
 7         if (keyevent->key()==Qt::Key_Right)
 8         {
 9             qDebug()<<"okk";
10             ui->bit0->setFocus();
11         }
12     }
13     return QObject::eventFilter(watched, event);
14 }

以下是探索出这个代码的过程和代码分析:

首先需要检测键盘按下的事件

至于为什么是KeyPress而不是Key_Right之类的方向键,我之前的想法是因为方向键获取不到所以我就先检测键盘按下再判断按下的是什么键

我原本的代码是这样的

这样自定义事件依旧没有效果,通过qDebug发现,输出只有press而没有okk,说明第二层if判断右键始终进不去,刚开始就是到这里觉得事件过滤器这个方法不行

后来又去查了参考了各种解决方法之后依葫芦画瓢改

框出来的是最主要的区别,这样的代码就能使自定义事件成功检测到键盘方向键并且不影响控件输入

但是为什么多声明一个QKeyEvent变量就可以了呢

然后研究代码的时候突然发现KeyPress和Key_Right的类名不同,好奇心驱使下把Qt::Key_Right改成了QEvent::Key_Right,然后发现字变黑了

查看QEvent的枚举成员发现并没有Key_Right这个成员,而用于检测信号的参数event是属于QEvent,所以大概是因为Key_Right不存在,导致之前第二个if一直进不去

最后要记得return,事件才能传递下去

然后在构造函数里对每一个需要的控件安装事件过滤器(下面代码只给出其中一个作为例子)

ui->控件名->installEventFilter(this);

ui->B30->installEventFilter(this);

 

标签:控件,方向键,键盘,Right,事件,Key
From: https://www.cnblogs.com/rabbit1103/p/18374127

相关文章

  • lazarus 3.4+fpc trunk编译tachart控件出错
    lazarus3.4+fpctrunk编译tachart控件出错原因:最新的fpc禁止访问private引起的修改方法:1、打开lazarus\components\tachart\tadatatools.pas将functionTDataPointDistanceTool.FindRef(APoint:TPoint;AMode:TDataPointMode;ADest:TDataPointTool.TPointRef;AOtherEndS......
  • 【python】PyQt5中的QFrame控件,控制图形的边框样式、阴影效果、形状等属性
    ✨✨欢迎大家来到景天科技苑✨✨......
  • WebDriver API剖析----元素、鼠标、键盘的操作
    一、元素的操作1、清除元素的内容clear()方法用于清除元素中已有的内容。fromseleniumimportwebdriverfromtimeimportsleepfromselenium.webdriver.common.byimportBydriver=webdriver.Firefox()driver.get("https://www.baidu.com")driver.find_element(......
  • 界面控件DevExpress WinForms中文教程:Data Grid(数据网格)简介(二)
    DevExpressWinFormsDataGrid是一个高性能的UI组件,由DirectX渲染引擎提供支持。数据网格(GridControl)提供了一个灵活的基于视图的体系结构,包括许多数据塑造和UI自定义特性,数据网格可以显示和编辑来自任何大小和复杂数据源的数据。P.S:DevExpressWinForms拥有180+组件和UI库,能......
  • 【pyautogui】 模拟鼠标、键盘操作库
    【背景】模拟鼠标、键盘操作【问题】1、pyautogui.move和pyautogui.moveTo的区别?pyautogui.moveTo(x=None,y=None,duration=0.0,tween=linearTween)这个函数会将鼠标光标直接移动到指定的屏幕坐标 (x,y)。如果 duration 参数被设置为非零值(以秒为单位),则光标会平滑......
  • 表格控件:计算引擎、报表、集算表
    近日,葡萄城正式发布了SpreadJS最新版本V17.1,为前端表格控件市场带来了一系列令人瞩目的新特性和功能增强。本次更新旨在进一步提升用户在计算引擎、报表生成和分析等方面的体验,为各行业的开发者提供更强大的工具支持。主要更新亮点工作薄增强居右对齐将样式的textDirection......
  • 界面控件DevExpress Blazor v24.2路线图预览——支持.NET 9、新增桑基图等
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。本文中包含了DevExpressBlazorv24.2官方发布的当前/预计的开发计划,请注意......
  • 通过代码添加的控件的事件如何编写?
    0背景这两天在重新复习事件,比如Winform控件的事件,利用vs很方便地实现。比如:想要在窗体加载时,修改窗口的标题;我们只需要双击Form1的标题栏即可;vs便会给我们生成如下代码,且光标自动定位到方法体中:privatevoidForm1_Load(objectsender,EventArgse){}然后我......
  • Delphi 的 TMS 控件安装方法
    * 参考:tmsxdataaurliussparkle的手工安装(XE7)--------------------------------------------------------------------------------------------说明:下述安装方法的意思是:1)将所有包项目的编译结果放在 /Bin目录中,并将/Bin路径,放入系统变量Path的查找路径中。因编译......
  • osk.exe 是“屏幕键盘”(On-Screen Keyboard)的可执行文件名,这是一种虚拟键盘应用程序,用
     osk.exe(屏幕键盘)的公开漏洞一般涉及以下几个方面:1. 安全性漏洞信息泄露:某些版本的osk.exe可能会在特定条件下泄露用户输入的信息,尤其是在使用输入法或进行敏感数据输入时。攻击者可能利用这些信息进行进一步的攻击或窃取数据。漏洞利用:有些恶意软件可能利用屏幕键盘......