我们需要对界面中的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文本框输入的字符进行限制的效果。详细代码如下图:
这个问题的解决过程,使我学到遇到问题,首先分析问题,然后针对问题,想出几种解决方法,对这方法一一实践,找出最好的解决方法。在写代码过程中,要仔细分析出错原因,我应该怎么改才能解决这个错误,想到可能原因之后要去实践,用实践来检验是否可行。