有一段时间都没有想出自己接下来可以写点什么,要说没工夫写那是给自己找借口了,更多的原因,还是觉得东西学得还不是很彻底,写出来的也显得幼稚和肤浅,反倒会贻笑大方了。然而,真要是按这种心态下去的话,我这也就别指望写点属于自己的东西了,所以还是知道多少写多少,由浅入深。希望一方面能帮到某些用得着的朋友,一方面也能巩固自身所学。
         在学习和应用Qt的工作当中,曾经花了很大的力气去解决一个问题——即希望在应用的软件当中,响应键盘的delete键去删除某一选中控件,前提是应用程序中已经存在一个delete按键,即希望两种方式都能实现对所选控件的删除功能。
         虽然在毫无头绪的情况下,向师兄请教了此种情况下的解决途径——使用类QWidget中的成员函数setFocus ()或setFocusPolicy( QWidget * w),将焦点设置在使用中的主窗口(active window,即活动窗口)。但是,情况并没有自己想象中的顺利,经过反复的修改、测试、再修改、再测试。最后也没能得到自己想要的结果。之所以这么不顺,不得不说,挫折发生还是有原因的。一方面当时自己对C++中this的使用还很生疏,而恰恰当时就需要用得着;另一方面,并不是对主窗口设置了焦点就能实现相应键盘删除的功能,在此之前还必须先做好另一项前提性的工作。以下说明自己在这个过程中的解决方法。
          将focus设置在主窗口,这点并没有错,因为成员函数setFocus()和setFocusPolicy( QWidget * w)本身就是为了使Widget接受键盘输入的焦点。只不过,在此值得说明的是,两个函数的使用方式和实现的功能稍有差异(对此,这里不再赘述,Qt Assistant中有更为详尽的说明)。在实现控件的删除功能相应键盘中delete键,首先要做的是设置好软件中delete按钮的另一种键盘按键快捷方式。这里有两种方式,一是使用函数setAccel ( const QKeySequence & ) ,另一种是在Qt Designer中对所选widget的accel属性设置快捷键,直接在键盘输入即可,如ctr+D。
做完该项工作,可以说就先完成了一个必要的前提工作。接下来,就可以使用setFocus这一成员函数,把焦点设置在主窗口,这样程序就会在主窗口当中去寻找可能的键盘相应事件,否则focus仍然在被选中的部件上,如某一选中的控件,这一点很重要。
          那么,是不是这样就可以了呢,答案是否定的,在这个响应事件当中,必须要注意时刻的选取。因为焦点会随着鼠标的点击或其他某种方式而改变,如选中某控件后,并不立即按下delete键删除,继续点击其他选项,这时再按delete的话,并不能实现删除的功能。这样会使系统因为找不到事件的目标而不起作用。就如一辆车在十字路口的时候不选择转弯,等到没有岔路口的时候又要求车转弯一样,已经散失了原有实现的条件。因此,这里必须要注意加入setFocus()语句的位置。程序员可以选择选中控件后的这一时刻,将焦点设置在主窗口,或者在鼠标左键点击某一控件这一事件后,立即运行setFocus()这一语句,从而使焦点在活动窗口上,系统能够在整个窗口内寻找可能要发生的响应键盘输入事件。
         说到这,我一直没有再说上面提到的this给我带来的困扰是什么。因为这其实只是对C++还不是很熟悉的朋友而言的,并非整个事件的障碍。在我本人修改和调试程序的过程中,因为还不是很懂得this的使用,虽然知道需要调用setFocus()这一函数,但如何调用,其实现方式却很难达成,属于“巧妇有米无柴也难炊”的状况。后来知道了this的使用后,问题才得以迎刃而解。其实很简单,如果是调用类,且实现删除功能的语句就在活动窗口类当中,这时只需要使用this->setFocus();即可。现在回过头再去看的时候,却又是那么简单。