QWidget键盘事件焦点(源代码级别研究)findumars

如何确定谁来接收键盘事件,不妨看一点点QApplication的源码:

X11下

QETWidget*keywidget=0;boolgrabbed=false;if(event->type==XKeyPress||event->type==XKeyRelease){keywidget=(QETWidget*)QWidget::keyboardGrabber();if(keywidget){grabbed=true;}elseif(!keywidget){if(d->inPopupMode())//nofocuswidget,seeifwehaveapopupkeywidget=(QETWidget*)(activePopupWidget()->focusWidget()activePopupWidget()->focusWidget():activePopupWidget());elseif(QApplicationPrivate::focus_widget)keywidget=(QETWidget*)QApplicationPrivate::focus_widget;elseif(widget)keywidget=(QETWidget*)widget->window();}}Windows下

QWidget*g=QWidget::keyboardGrabber();if(g&&qt_get_tablet_widget()&&hwnd==qt_get_tablet_widget()->winId()){//ifwegetaneventfortheinternaltabletwidget,//thendon'tsendittothekeyboardgrabber,but//sendittothewidgetitself(wedon'tuseitright//now,justincase).g=0;}if(g)widget=(QETWidget*)g;elseif(QApplication::activePopupWidget())widget=(QETWidget*)QApplication::activePopupWidget()->focusWidget()(QETWidget*)QApplication::activePopupWidget()->focusWidget():(QETWidget*)QApplication::activePopupWidget();elseif(QApplication::focusWidget())widget=(QETWidget*)QApplication::focusWidget();elseif(!widget||widget->internalWinId()==GetFocus())//Wefakedthemessagetogotoexactlythatwidget.widget=(QETWidget*)widget->window();大致顺序:

问题:当我们按下Tab键(或者上下左右箭头键)时,下一个或获取焦点的QWidget是如何被确定的?

我们重新贴出上文最后贴出过的QWidget::event()的源码:

caseQEvent::KeyPress:{QKeyEvent*k=(QKeyEvent*)event;boolres=false;if(!(k->modifiers()&(Qt::ControlModifier|Qt::AltModifier))){//###AddMetaModifierif(k->key()==Qt::Key_Backtab||(k->key()==Qt::Key_Tab&&(k->modifiers()&Qt::ShiftModifier)))res=focusNextPrevChild(false);elseif(k->key()==Qt::Key_Tab)res=focusNextPrevChild(true);if(res)break;}keyPressEvent(k);老是觉得QWidget::focusNextPrevChild()这个函数有点名不符实(或者有点别扭),因为:

boolQWidget::focusNextPrevChild(boolnext){Q_D(QWidget);QWidget*p=parentWidget();boolisSubWindow=(windowType()==Qt::SubWindow);if(!isWindow()&&!isSubWindow&&p)returnp->focusNextPrevChild(next);...}当我们调用一个Widget该成员时,最终将递归调用到其所在窗口的focusNextPrevChild成员。(不过这是一个protected的虚函数,在派生类中可以覆盖它,从而控制派生类实例中的焦点移动。)

QWidgetPrivate内有3个成员变量:

classQ_GUI_EXPORTQWidgetPrivate:publicQObjectPrivate{...QWidget*focus_next;QWidget*focus_prev;QWidget*focus_child;这3个变量可以分别用:

进行获取。

前两个可以用来构成一个focus链表。

voidQWidgetPrivate::init(QWidget*parentWidget,Qt::WindowFlagsf){Q_Q(QWidget);focus_next=focus_prev=q;...voidQWidgetPrivate::reparentFocusWidgets(QWidget*oldtlw){...通过QWidget::setTabOrder()可以调整Widgets在focus链表中的顺序

比如一个类似软键盘的东西,在一个QWidget上面放置了大量的QPushButton。此时,除了Tab/Shift+Tab外,上下左右箭头也都可以用来移动焦点。

这是因为:

voidQAbstractButton::keyPressEvent(QKeyEvent*e){boolnext=true;switch(e->key()){caseQt::Key_Up:caseQt::Key_Left:next=false;//fallthroughcaseQt::Key_Right:caseQt::Key_Down:...focusNextPrevChild(next);}focusproxyManual中说的比较清楚:

简单列出源码:

voidQWidget::setFocus(Qt::FocusReasonreason){QWidget*f=this;while(f->d_func()->extra&&f->d_func()->extra->focus_proxy)f=f->d_func()->extra->focus_proxy;boolQWidget::hasFocus()const{constQWidget*w=this;while(w->d_func()->extra&&w->d_func()->extra->focus_proxy)w=w->d_func()->extra->focus_proxy;其他QApplication::setNavigationMode()设置可通过方向键来控制焦点进行上下左右的移动。

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

setfocus()是让某个窗体获得焦点

setfocusPolicy是设置窗体怎么获得焦点

Setsthiswidget'sfocusproxytow.Ifwis0,thisfunctionresetsthiswidgettonothaveanyfocusproxy.

将该widget的focusproxy设置给w。如果w为0,该函数将此widget设为没有任何focusproxy。

有些widget,比如QComboBox,可以“拥有focus”,但是它们会创建一个子的widget来实际地处理焦点。比如QComboBox创建的叫做QLineEdit。

setFocusProxy()用来指定当该widget获得焦点时实际上由谁来处理这个焦点。如果某个widget拥有focusproxy,focusPolicy(),setFocusPolicy(),setFocus()和hasFocus()都是对focusproxy进行操作。

THE END
1.析易科研怎么做前瞻性研究?追踪回顾性科学性科学方法临床前瞻性研究是一种研究设计,它从现在为起点,追踪观察研究对象到未来,以观察和记录研究对象的变化和结果。这种研究方法可以弥补回顾性研究的不足,适用于多种研究领域,如流行病学、临床研究和社会科学等,特别是在需要了解事件时间顺序的情况下尤为重要。 https://www.163.com/dy/article/JHEFGISH05568E1Z.html
2.焦点结构和意义的研究毕业论文.doc焦点结构和意义的研究毕业论文.doc焦点结构和意义的研究徐烈炯潘海华主编11目录前言 ①作者通讯录 (V)生成语法对焦点的研究 胡建华(1)几个不同的焦点概念 徐烈炯(13)焦点的语音表现 徐烈炯(41)焦点结构的类型及其对汉语词序的影响 罗仁地潘露莉(57)Rocliemont关于英语焦点表现的研究 沈园(79)焦点关联现象与对https://www.taodocs.com/p-393943695.html
3.好买私募基金网好买私募基金网是中国权威的私募基金研究机构,帮助私募投资者选择最优秀的阳光私募基金,并完成私募基金购买手续。提供最新的私募基金净值、私募基金排名,最全的私募基金公司、私募基金经理、私募产品数据库。https://simu.howbuy.com/
4.手把手教你用户研究焦点小组焦点小组是设计环节中数据采集的一种方式,在经验丰富的主持人的指导下,精挑细选出的、具有很强代表性的参与者可以为主题、模式和趋势提供深刻的见解。 概念 焦点小组是一种定性研究方法。多人同时访谈、开个座谈会讨论一下就是我们常说的焦点访谈的形式。 https://www.jianshu.com/p/e6f2eeb6c424
5.第1页焦点研究院第1页北京搜狐焦点为购房者提供北京房产信息、家居装修资讯,北京房产楼盘详情、买房流程、业主论坛、家居装修等全面内容信息,北京搜狐焦点互联网的购房平台。https://house.focus.cn/author/157860400/newslist
6.笔记(设计质性研究(第5版))书评目 录第1章 导论1.1 需要考虑的事项1.1.1 “做的可能性”:考虑可行性1.1.2 “应当做的可能性”:考虑研究潜力和研究伦理1.1.3 “愿意做的可能性”:持久且延续的研究兴趣1.2 需要面对的挑战1.2.1 概念框架1.2.2 研究设计和研究方法1.2.3 研究者的能力1.3 展开论证1.4 全书内容概览第2章 质性研究的类型2.1 https://book.douban.com/review/13505426/
7.研究的焦点的翻译是:正在翻译,请等待中文翻译英文意思,翻译研究的焦点 青云英语翻译 请在下面的文本框内输入文字,然后点击开始翻译按钮进行翻译,如果您看不到结果,请重新翻译! 选择语言:从中文简体中文翻译英语日语韩语俄语德语法语阿拉伯文西班牙语葡萄牙语意大利语荷兰语瑞典语希腊语捷克语丹麦语匈牙利语希伯来语波斯语挪威语乌尔都语罗马尼亚语土耳其语波兰语到中文简体中文翻译http://eyu.zaixian-fanyi.com/fan_yi_3780839
8.用户研究方法——焦点小组焦点小组(focus group)及其与其它用户研究方法的区别 焦点小组(focus group)是在可用性工程中使用的比较多的一种方法,通常用于产品功能的界定、工作流程的模拟、用户需求的发现、用户界面的结构设计和交互设计、产品的原型的接受度测试、用户模型的建立等。 http://www.blueidea.com/news/other/2006/4092.asp
9.初中研究性学习:关注的焦点在哪里初中研究性学习:关注的焦点在哪里 研究性学习是指学生在老师的指导下,从自然、社会、生活中选择和确立专题进行研究探索,并在研究过程中积极主动地获取知识,应用知识,发现问题,解决问题的学习活动。它是最有效、最有用、最主动、最能激发学生创造性和想像力的学习,同时也是最能体现人本性、人文性和素质教育内涵的学习https://www.fwsir.com/jy/html/jy_20080807124633_160445.html
10.高中数学高中数学_抛物线焦点弦问题探究教学设计学情分析教材分析课后反思.doc,PAGE 2 PAGE 《抛物线焦点弦问题探究》教学设计 教学目标: (1)掌握抛物线焦点弦的有关性质及其获得过程; (2)在进一步培养直观想象、逻辑推理等核心素养的过程中,提高学生研究性学习能力; (3)https://max.book118.com/html/2021/1021/8011111005004023.shtm
11.肠道菌群——国自然研究又一热点肠道菌群作为寄居在人体肠道内的微生物群落,是近年来微生物学、医学、基因学等领域最引人关注的研究焦点之一。随着抗生素的迅速使用和高热量、低纤维饮食的摄入导致肠道微生物群落紊乱,使人类易患代谢综合征等多种疾病。虽然已有大量的研究致力于微生物群对个体出生后的环境影响,但是作者对于胚胎期肠道微生物群的作用却http://www.yingbio.com/article-35507-188022.html
12.焦点解决治疗:理论研究与实践Alisdair J.Macdonal博士,精神病学家,英国心理治疗委员会注册家庭治疗师,欧洲心理治疗协会焦点解决短程治疗分会前任主席,长期担任英国圣马丁大学焦点解决治疗硕士培训可查讲师。发表过大量焦点解决治疗循证研究文章,是世界知名焦点解决治疗领域的实证研究专家。近年来,应邀在世界各地讲学,推广焦点解决短程治疗。 编辑推荐 本https://www.psychspace.com/space/viewnews-27049
13.近五年国际图书情报学研究热点前沿及其知识基础基于17种外文构建知识基础图谱:利用可视化技术,构建图书情报学研究的知识基础图谱,展现不同研究主题之间的关联性及其发展脉络。哪些主题在近五年内成为图书情报学领域的研究热点?通过对期刊文献的关键词、摘要和主题进行分析,识别并归纳出该领域的主要研究焦点。图书情报学领域的研究前沿有哪些特点?通过文献的时间序列分析,探索新兴的https://www.renrendoc.com/paper/327848387.html
14.张巍研究焦点: 我们的研究兴趣主要在肿瘤学和重症医学两个方向。方向一,探索肿瘤局部侵袭与远处转移,特别是肿瘤细胞如何穿过基质间极小狭窄孔隙的细胞和分子机制;此外,我们对肿瘤微环境与肿瘤免疫也有兴趣;方向二,探索重症感染,特别是脓毒症发生时机体内皮屏障的破坏和机体免疫状态的剧烈变化。我们的目的是根据新发现的机制http://sklb.scu.edu.cn/detail.html?type=postgraduateDetail&id=137