Qt   键盘事件

我们需要对界面中的TextEdit文本框输入进行限制,让其无法输入除十六进制所需的字符和其他几个必要字符外,无法输入其他的字符。而这个功能LineEdit是可以通过正则表达式做到的,具体代码如下图:

我们想让TextEdit也能实现这个功能,我们首先想到的是模仿LineEdit中的Validator函数,让TextEdit也有Validator函数,我找到了qlineedit.cpp文件,发现其内部结构太过复杂,我暂时的能力还无法实现这个代码的模仿,同时也觉得既然TextEdit没有Validator函数肯定有其原因,盲目移植可能会造成很多不必要的问题,所以这个想法就在此停止,开始考虑其他方法去实现。

接下来,我想到的是既然我们需要对TextEdit文本框中的键盘事件进行处理,而直接在qtextedit.cpp里面修改又不好,于是我就想到了自己重新重载一个函数,而这个函数是继承QTextEdit的,那么在这个重载的函数中添加对键盘事件进行处理的函数是否可以实呢?这里面遇到了很多问题,现在我详细记录一下这里的思考过程。重载TextEdit函数内容如下图:

首先遇到的重载的方法不太会,我查了C++书中的重载方法,重新看了Qt的入门书籍,再加上向别人请教,终于写出了重载函数的雏形;然后遇到就是我用代码创建的edit文本框是局部变量,为了使edit可以在textedit.cpp中使用,我编写了一个头文件用来声明这个变量,同时重新定义这个edit局部变量使其变成全局变量。

全局变量定义语句:TextEdit*edit;

声明语句:externTextEdit*edit;

在对键盘事件处理的函数中我采用的是发送信号,在主窗口接收这个信号转到槽中,使输入的数在TextEdit中显示,这里遇到了一个问题,我可以在ui->TextEdit中显示所需要的数,达到限制不需要的数显示的效果,可是却无法再edit文本框中显示。我猜测这是因为我发送信号之后马上就执行槽函数,而键盘事件函数没有执行完造成的冲突,于是我查阅了相关资料去验证我的猜测,我重新定义connect实现键盘事件函数执行完成后再执行槽函数,可是最后还是冲突,无法显示。于是这个方法只好暂时搁浅。

(补)在完成事件过滤之后,我又重新考虑这个方案,发现了一句特别好用的语句QTextEdit::keyPressEvent(event);在voidTextEdit::keyPressEvent(QKeyEvent*event)函数中添加上述语句,让程序重新回到默认事件的处理函数中去,就可以完成edit的显示了。

最后我无意间看到了事件过滤这个函数,于是我采用事件过滤函数要编写代码实现过滤不需要的字符来起到限制的效果。最后成功的结果了这个问题,实现了对TextEdit文本框输入的字符进行限制的效果。详细代码如下图:

这个问题的解决过程,使我学到遇到问题,首先分析问题,然后针对问题,想出几种解决方法,对这方法一一实践,找出最好的解决方法。在写代码过程中,要仔细分析出错原因,我应该怎么改才能解决这个错误,想到可能原因之后要去实践,用实践来检验是否可行。

时间: 2024-10-08 08:16:39

Qt   键盘事件的相关文章

Qt键盘事件--组合键响应方法

按键+按键组合,例如ctrl+字母: 1 void MyAPP::keyPressEvent(QKeyEvent *event) 2 { 3 if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_A)) 4 { 5 QMessageBox::aboutQt(NULL, "aboutQt"); 6 } 7 } 按键+鼠标组合,例如ctrl+左击: 1 void M

Qt中的键盘事件,以及焦点的设置(比较详细)

Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等. 焦点移动的方式有以下几种: 按下Tab或Shift+Tab 注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等 Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代. 点击一个QWidg

QWidget 键盘事件 焦点(QApplication源码)

在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件. 键盘事件派发给谁? 如何确定谁来接收键盘事件,不妨看一点点QApplication的源码: X11下 QETWidget *keywidget=0; bool grabbed=false; if (event->type==XKeyPress || event->type==XKeyRelease) { keywidg

QT5 OpenGL (六, 键盘事件, 开关灯,放大缩小综合运用)

概要 实例效果图 立体图放大图 立体图缩小图 不加矢量开灯图 不加矢量关灯图 加矢量关灯图1 加矢量关灯图2 部分代码展示 主要内容解析 QT键盘事件 立体图形的放大和缩小 上下左右键以及A键D争键控制x y z 轴旋转速度的快慢 开灯关灯以及矢量的实现原理 概要 多篇讲QT5 opengl的文章,从简单到复杂,几乎每篇都在原来的基友上有所增加新的内容, 感觉越到后面,越容易被opengl强大的功能所震撼, 而这篇文章主要是把前面所讲的一些内容进行综合, 然后再加入新的一些内容的运用. 首先,

【PyQt5-Qt Designer】鼠标+键盘事件

重定义鼠标响应+键盘响应事件 一,每个事件都被封装成相应的类: pyqt中,每个事件类型都被封装成相应的事件类,如鼠标事件为QMouseEvent,键盘事件为QKeyEvent等.而它们的基类是QEvent. 二,基类QEvent的几个重要方法: accept() 表示事件已处理,不需要向父窗口传播 ignore()表示事件未处理,继续向父窗口传播f type()返回事件类型,如QtCore.QEvent.MouseButtonPress,一般由基事件调用.因为其它事件已经知道自己的事件类型了.

QT无窗口状态下对键盘事件的监听

Question:最近在搞linux下的一个客户端项目,需要接收键盘事件,但是又不能有界面,这种情况怎么处理呢? int main(int argc, char *argv[]) { QApplication a(argc, argv); Test *p = new Test; a.installEventFilter(p); return a.exec(); } bool Test::eventFilter(QObject *obj, QEvent *event) { if(event->ty

Qt 的事件原理

Qt的事件比如那些特定事件 ,估计大家都会使用,但是各种原理未必所有人都能理解深透,现在上图 一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是每个事件都对应同一个事件处理器,在该事件处理器中对不同的事件进行分类处理,这样的弊端有两点:第一,导致该事件处理器过于臃肿复杂:第二,这样不便于扩展,当系统新增加事件类型或者是我们需要使用到自定义事件时,就不得

QT 捕获事件(全局拦截)

QT 捕获应用键盘事件(全局拦截) 主窗口只有一个QTabWidget,每个tab中嵌入相应的窗口,在使用的过程中,需要主窗口响应键盘事件,而不是tab中的控件响应.故采取以下方式. 重写QApplication,使用notify来控制拦截所有事件. 此方法不仅可拦截键盘事件,其他事件也可. 代码如下: #include "mainwindow.h" //#include <QApplication> #include "application.h" #

基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: 要实现以上的功能,需要几个对象: 事件分派器:EventDispatcher,负责将 BaseEvent 分派给 EventListener 对象 事件监听器:EventListener,这只是一个接口类,接受 BaseEvent 的对象,真正的处理在它的子类中实现 事件:BaseEvent,储存