Qt应用 键盘聚焦是本文介绍的内容,关于键盘的更多内容,请参考本文末尾。Qt的部件按照GUI设计中的惯例来处理键盘聚焦。
基本的问题就是,用户的击键动作能够直接聚焦在屏幕上的任意窗口,或者是内嵌在特定窗口的任意部件上。当用户按下一个键时,他们期望焦点在他们期望的位置,软件必须要满足这个需求。系统必须要决断击键动作直接聚焦在哪个应用程序,应用程序的哪个窗口,窗口的哪个部件。
聚焦动作
将键盘焦点聚集在一个特定的部件上的惯例有以下几种:
1、用户按下Tab(或者Shift+Tab)
2、用户点击一个部件
3、用户按下一个键盘快捷键
4、用户使用鼠标滚轮
5、用户把焦点移动到一个窗口,这时应用程序必须决定窗口的哪个部件应该获得焦点
以上这些动作机制是不同的,这些动作之中,会有不同的部件接收到焦点。下面将依次介绍:
Tab 或者 Shift+Tab
按下Tab键是使用键盘移动焦点最常用的方式。(有时在数据录入型应用程序中Enter的作用和Tab键一样;在Qt中通过一个event filter很容易实现)
在常用的所有窗口系统中按下Tab键,每个窗口都有一个包含了其上所有部件的循环列表,焦点会切换到这个列表的下一个部件。Tab键会按照循环列表的一个方向切换焦点,而Shift+Tab按照相反的方向切换。按下Tab键后在部件之间切换的顺序被称为tab顺序。
你可以使用QWidget::setTabOrder()来定制tab顺序。(如果你不这样做,Tab通常会以部件创建的顺序切换焦点)Qt Designer提供一种可视化的方式来改变tab顺序。
因为按下Tab键非常常用,大部分可以获得焦点的部件都支持tab聚焦。有些罕见的部件是个例外,他们通过一些键盘加速器或者错误(keyboard accelerator or error)来切换焦点。
举个例子,在一个数据录入型对话框中,有一个只有在百分之一的情况下才必要的区域。在这样的对话框中,Tab键就会跳过这个区域,对话框可以使用以下机制:
1、如果程序可以决定这个区域是否需要,它可以在用户完成录入按下OK键,或者当用户完成其它区域的录入之后按下Enter,把焦点切换到那里。或者,将此区域包含在tab顺序中但将它禁用。当用户已经设置完其它的区域,该区域变得比较适合时,再启用它。
2、此区域上的标签可以包括一个键盘快捷键,以使焦点可以切换到此区域上。
关于Tab支持的另外一种例外是必须支持tab插入的文本录入型部件;几乎所有的文本编辑器都属于这一类。Qt把Ctrl+Tab当做Tab,Ctrl+Shift+Tab当做Shift+Tab,这些部件可以重新实现QWidget::event()函数,在调用QWidget::event()完成所有其它按键的正常处理之前处理Tab.然而,因为一些系统将Ctrl+Tab用作其它的用途,用户因此可能不知道Ctrl+Tab,总的来说并没有一种完全的解决办法。
用户点击部件
这可能是在使用鼠标或者其它点式设备的电脑上比Tab键更常见的聚焦方式。
通过点击来切换焦点比Tab更强大一些。当把焦点移动到某一个部件时,对于编辑型部件而言,文本的光标(部件内部焦点)也会移动到了鼠标点击的位置点上。
由于这种方式如此的常见,用户很习惯这种方式,自然而然的应该是大部分部件都支持这种方式。然而,也存在一些需要的理由要规避这种方式:比如用户可能不想从当前焦点所在的部件上移除焦点。
举例来说,再一个文本编辑器中,当用户点击‘B’(粗体)功能按钮,键盘焦点应该怎么应对?是应该保留在它所在的位置,一般来说这个时候肯定是在编辑文本当中,还是将焦点移动到‘B’按钮处?
我们建议支持文本录入的部件同时支持点击聚焦,为了避免上述情况鼠标点击在不同的情况下会承担不同的作用。(对于按钮来说,我们推荐添加键盘快捷键,QAbstractButton及其子类可以很容易实现)
在Qt中,只有QWidget::setFocusPolicy()函数会影响点击聚焦。
用户按下键盘快捷键
通过键盘快捷键来切换焦点不是很常见。在打开模态对话框时会隐式发生,但是如果使用诸如QLabel::setBuddy(),QGroupBox,QTabBar提供的焦点加速器时会明确的发生。
我们建议用户想要跳转的所有部件都支持快捷键聚焦。举例来说,一个标签对话框可以为每个页面设置键盘快捷键,因此用户可以按下比如Alt+P快捷键来跳转到打印页面。但是按键总共就只有那么多,所以为命令提供键盘快捷键显得很重要。Alt+P也可以用作粘贴、播放、打印的快捷键,比如在Standard Accelerator Keys列表中就这样用。
用户滚动鼠标滚轮
在微软Windows操作系统中,鼠标滚轮往往是由具有键盘焦点的部件来处理。在Mac OS X和X11中,则是由获得其它鼠标事件的部件来处理。
Qt处理这种平台差异性的方法是当使用滚轮时让部件切换键盘焦点。应用程序遵循每个部件上的正确的聚焦策略,应用程序就可以以惯用的方式在Windows,Mac OS X,和X11平台上正确的运行。
用户把焦点移动到窗口
在这种情况下,应用程序必须决定窗口内的哪个部件获得焦点。
这可能很简单,如果焦点之前已经在该窗口上,之前获得焦点的***一个部件会重新获得焦点。Qt可以自动实现。
如果焦点之前从没有聚焦到该窗口上,而且你知道焦点应该开始于哪里,在调用QWidget::show()之前调用某部件上的QWidget::setFocus(),该部件就会获得焦点。如果不这样做,Qt会挑选一个合适的部件来使它获得焦点。
小结:关于Qt应用 键盘聚焦的内容到这里就介绍完了,希望本文能对你有所帮助。更多相关 内容请参考编辑推荐。