Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点。基本出发点是用户的击键能定向到屏幕上窗口中的任何一个,和在窗口中任何一个部件中。当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并且软件必须尽量满足这种希望。系统必须确定击键定位在哪一个应用程序、应用程序中的哪一个窗口和窗口中的哪一个窗口部件。

1、焦点移动的方式

把焦点定位特殊的窗口部件的习惯方式有:

(1)用户按下Tab键(或者Shift键+Tab键)(或者有时是Enter键)。

(2)用户点击一个窗口部件。

(3)用户按下一个键盘快捷键。

(4)用户使用鼠标滚轮。

(5)用户移动焦点到一个窗口,并且应用程序必须决定窗口中的哪个窗口部件应该得到焦点。

这些移动机制的每个都是不同的,并且不同类型的窗口部件只能接收它们中的一些方式的焦点。下面我们将按次序介绍它们。

(1)Tab或者Shift+Tab.

按Tab键是到目前为止用键盘移动焦点的最通用的方法。有时在输入数据的应用程序中Enter键和Tab键的作用是一样的。我们暂时忽略这一点。

所有窗口系统中的有关焦点的最通用使用方法是:按Tab键移动键盘焦点到每个窗口的窗口部件循环列表中的下一个窗口部件。Tab键按照循环列表的一个方向移动焦点,Shift键+Tab键按另一个方向移动焦点。按Tab键从一个窗口部件到下一个窗口部件移动焦点的次序叫做Tab键次序。

在Qt中,窗口部件循环列表存放在QFocusData类中。每个窗口有一个QFocusData对象,并且当选择合适的 QWidget::FocusPolicy焦点策略的QWidget::setFocusPolicy()被调用的时候,窗口部件自动把它们自己追加到列表的末尾。你可以使用QWidget::setTabOrder()来自定义Tab键控制次序。如果你没有定义这个次序,那么Tab键会按照窗口部件构造的顺序移动焦点。Qt designer工具提供了一个可视化的改变Tab键控制次序的方法。

因为按Tab键是如此的常用,大多数含有焦点的窗口部件应该支持Tab焦点。主要例外情况是几乎没用到的窗口部件,并且在窗口部件上有一些移动焦点的键盘快捷键或者错误处理。

(2)用户点击一个窗口部件。

在使用鼠标或者其它指针设备的计算机中,用鼠标点击一个窗口部件是一种比按Tab键更常用的方法。

当鼠标点击把焦点移到一个窗口部件时,对于编辑器窗口部件,它也会移动文本光标(窗口部件的内部焦点)到鼠标被点击的地点。

鼠标点击移动焦点是大多数窗口部件必须支持的,有时窗口部件需要避免鼠标点击移动焦点。例如:在一个字处理程序中,当用户点击"B"(粗体)工具按钮,键盘焦点应该保留在原来的位置。在Qt中,只有QWidget::setFocusPolicy()函数影响点击焦点。

(3)用户按下一个键盘快捷键。

使用键盘快捷键来移动焦点不是很常用。这种情况可能会隐含地发生在打开的模式对话框中,但是也会显式地发生在使用焦点加速器中,例如在QLabel::setBuddy()、QGroupBox和QTabBar提供的加速器中。

用户想让焦点跳到的窗口部件都应支持快捷键焦点。例如:一个Tab对话框为它的每一个页提供键盘快捷键,所以用户可以按下比如Alt+P来跳到打印页面。但只能有少量的快捷键,并且为命令提供键盘快捷键也很重要,如:在标准快捷键列表中,Alt+P也可以用来粘贴、播放或打印。

(4)用户使用鼠标滚轮。

在Microsoft Windows上,鼠标滚轮的用法是一直由有键盘焦点的窗口部件处理。在Mac OS X和X11上,它由获得其它鼠标事件的窗口部件处理。

Qt处理这种平台差异的方法是当滚轮被使用时,让窗口部件移动键盘焦点。每个窗口部件上有合适的焦点策略,应用程序可以在Windows、Mac OS X和X11上按照习惯正确地处理焦点。

(5)用户移动焦点到这个窗口。

在这种情况下,应用程序必须决定窗口中的哪一个窗口部件接收焦点。Qt自动实现这样的做法:如果焦点以前在这个窗口中,那么窗口中有焦点的最后一个窗口部件应该重新获得焦点。如果以前焦点就从来没有来到过这个窗口,并且你知道焦点应该从哪里开始,就在你调用QWidget::show()显示它之前,在应该接收焦点的窗口部件上调用QWidget::setFocus()。如果你不知道,Qt会选择一个合适的窗口部件。

2、焦点策略及操作函数

键盘焦点的策略及操作函数说明如下:

(1)焦点策略属性变量

focusPolicy 焦点策略属性变量保存的是窗口部件接收键盘焦点的策略。如果窗口部件通过tab来接收键盘焦点,这个策略就是QWidget::TabFocus;如果窗口部件通过点击来接收键盘焦点,这个策略就是QWidget::ClickFocus;如果窗口部件上述两种方式都使用,是 QWidget::StrongFocus;并且如果它不接收焦点(QWidget的默认值),是QWidget::NoFocus。

如果一个窗口部件处理键盘事件,你必须使键盘焦点生效。这通常在窗口部件的构造函数中完成。例如,QLineEdit的构造函数调用setFocusPolicy(QWidget::StrongFocus)。

(2)void QWidget::setFocus() [虚槽]

函数setFocus()把键盘输入焦点赋给这个窗口部件(或者它的焦点代理)。

首先,一个焦点移出事件会被发送给焦点窗口部件(如果有的话)告诉它关于失去焦点的事情。然后一个焦点进入事件被发送给这个窗口部件告诉它刚刚接收到焦点。(如果焦点移出和进入的窗口部件是同一个的话,就什么都没有发生。)

函数setFocus()会把焦点给一个窗口部件,而不管它的焦点策略,但是不会清空任何键盘捕获(grabKeyboard())。请注意如果窗口部件是被隐藏的,它将不接收焦点。

(3)void QWidget::setFocusProxy(QWidget * w) [虚]

函数setFocusProxy设置这个窗口部件的焦点代理为窗口部件w。如果w为0,这个函数重置这个窗口部件没有焦点代理。

一些窗口部件,比如QComboBox,能够"拥有焦点",但创建一个子窗口部件来实际处理这个焦点。例如,QComboBox创建了一个QLineEdit来处理焦点。

当"这个窗口部件"获得焦点时,setFocusProxy()设置的这个窗口部件实际获得焦点。如果有了一个焦点代理,focusPolicy()、setFocusPolicy()、setFocus()和hasFocus()都在这个焦点代理上操作。

小结:QT核心编程之键盘焦点的内容介绍完了,希望本文对你有所帮助,如果需要参考更多的内容,请看编辑推荐

https://blog.csdn.net/nowayings/article/details/38729785

Qt的焦点策略的更多相关文章

  1. PyQt(Python+Qt)学习随笔:Qt Designer中部件的焦点策略focusPolicy设置

    在Qt Designer中可以设置部件的焦点策略,部件的焦点策略属性取值范围由枚举类型Qt.FocusPolicy来定义,该枚举类型及其含义如下表所示: 注意:经老猿测试鼠标轮滚动获取焦点,只有在鼠标 ...

  2. setFocus一定要写在setLayout设置的后面,否则不起作用——使用setFocusPolicy为控件设置不同的焦点策略:Tab焦点,Click焦点,Wheel焦点和没有焦点

    QLineEdit* pEditor = new QLineEdit(m_strText);    pEditor->resize(.......);    pEditor->move(. ...

  3. Qt之Tab键切换焦点顺序

    简介 Qt的窗口部件按用户的习惯来处理键盘焦点.也就是说,其出发点是用户的焦点能定向到任何一个窗口,或者窗口中任何一个部件. 焦点获取方式比较多,例如:鼠标点击.Tab键切换.快捷键.鼠标滚轮等. 习 ...

  4. 关于QT的系统总结

    编译环境与开发流程 开发QT有两种IDE可以使用,一种是使用 VS + Qt 的插件,另一种就是使用QtCreator工具.前一种是微软的工具,用的都比较多容易上手,缺点是信号槽的支持不太好,需要手写 ...

  5. 关于QT的系统总结(非常全面,非常好)

    源地址:http://www.cnblogs.com/wangqiguo/p/4625611.html 阅读目录 编译环境与开发流程 QT项目的构成及原理 QT中的布局 QT中的通用控件 QVaria ...

  6. [转] 关于QT的系统总结

    出处:http://www.cnblogs.com/wangqiguo/p/4625611.html 阅读目录 编译环境与开发流程 QT项目的构成及原理 QT中的布局 QT中的通用控件 QVarian ...

  7. Qt子类化后qss设置背景色无效的问题

    1.问题背景 在某个类中,用到了一个组合的widget,有按钮进度条等,类似于视频播放器按钮控制区和精度条(参考了很多feiyangqingyun的文章,感谢),调试正常后整理代码,为了提高代码可读性 ...

  8. PyQt(Python+Qt)学习随笔

    老猿Python博文目录 老猿Python博客地址 PyQt学习随笔 PyQt(Python+Qt)帮助文档官网及文档下载 PyQt(Python+Qt)学习随笔:PyQt帮助文档导入assistan ...

  9. PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解

    本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...

随机推荐

  1. 游戏server之server优化思路

    本文仅仅是提供一些游戏server优化思路,当中一些思路是用在不同场合的,不是同个架构的.须要依据应用场景选用合适方式. 本文的引用的文章都是在自己写的在本博客内的.也都是上线开几百个服的成熟项目的. ...

  2. MySql 存储引擎的选取

    存储引擎是为不同的表类型处理 SQL 操作的 MySql 组件.InnoDB 是默认的.最通用的存储引擎,也是官方推荐使用的存储引擎,除非一些特定案例.MySql 5.6 中的 CREATE TABL ...

  3. 10.cocos2d坐标系

    一.笛卡儿坐标系 OpenGl坐标系为笛卡儿右手系.x向右,y向上,z向外.在cocos2d-lua中坐标系原点在屏幕的左下角,x向右,y向上,z则是指的zorder(层级). 二.世界坐标系,本地坐 ...

  4. ArraySegment 的使用 【转载】

    本文转载自 http://www.cnblogs.com/overred/archive/2009/01/17/1359126.html ArraySegment顾名思义就是Array区块,数组的小抽 ...

  5. LBP 特征

    LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征 ...

  6. kali之Nmap (Network Mapper(网络映射器)

    Nmap是主机扫描工具,他的图形化界面是Zenmap,分布式框架为Dnamp. Nmap可以完成以下任务: 主机探测 端口扫描 版本检测 系统检测 支持探测脚本的编写 Nmap在实际中应用场合如下: ...

  7. js31---观察者模式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  8. launcher- 第三方应用图标替换

    有时候我们感觉第三方应用的icon不美观,或者跟我们主题风格不一致,这时候我们希望换成我们想要的icon,那我们可以这么做(以更换QQ应用icon为例): 1.首先我们当然要根据自己的需要做一张替换i ...

  9. 1.22 Python基础知识 - 正则表达式

    Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re ...

  10. CF1009F Dominant Indices(树上DSU/长链剖分)

    题目大意: 就是给你一棵以1为根的树,询问每一个节点的子树内节点数最多的深度(相对于这个子树根而言)若有多解,输出最小的. 解题思路: 这道题用树链剖分,两种思路: 1.树上DSU 首先想一下最暴力的 ...