Qt之findChild

来源:互联网 发布:华为 mac过滤 编辑:程序博客网 时间:2024/06/05 19:58

原文地址::http://blog.csdn.net/liang19890820/article/details/52118210


相关文章

1、QT findChild() 及动态初始化窗体布局(原创)----http://zhaiyue-program.iteye.com/blog/1546394


简述

在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。

  • 简述
  • 查找选项
  • findChild
    • 描述
    • 示例
  • 分析
    • 效果
    • 源码
    • 可能情况

查找选项

  • 枚举Qt::FindChildOption:

Qt::FindChildOptions是一个QFlags<FindChildOption>类型定义,它存储一个或FindChildOption的组合值。

常量值描述Qt::FindDirectChildrenOnly0x0查找object的直接孩子Qt::FindChildrenRecursively0x1查找object的所有孩子(递归搜索)

findChild

描述

返回对象中类型可以转换为T,并且名为name的孩子。如果不满足条件,则返回0。默认执行递归搜索,除非指定选FindDirectChildrenOnly。

<code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">T QObject<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::findChild</span>(const QString <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span> name <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> QString(), Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::FindChildOptions</span> options <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::FindChildrenRecursively</span>) const</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

如果有一个以上的孩子匹配搜索,返回最直接的祖先。如果有几个直系祖先,没有定义哪一个将被返回。这种情况下,应该使用findChildren()。

示例

这个示例,返回parentWidget中一个名为“button1”的QPushButton孩子,即使按钮不是父亲的直接孩子:

<code class="language-Qt hljs haskell has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QPushButton</span> *button = parentWidget->findChild<<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QPushButton</span> *>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"button1"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这个示例,返回parentWidget中的一个QListWidget孩子:

<code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">QListWidget <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">list</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>findChild<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>QListWidget <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*></span>();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这个示例,返回parentWidget(它的直接父亲)中一个名为“button1”的QPushButton孩子:

<code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">QPushButton <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>button <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>findChild<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>QPushButton <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*></span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"button1"</span>, Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::FindDirectChildrenOnly</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这个示例,返回parentWidget(它的直接父亲)中的一个QListWidget孩子:

<code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">QListWidget <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">list</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>findChild<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>QListWidget <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*></span>(QString(), Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::FindDirectChildrenOnly</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

我们不妨来分析一下!

分析

假如我们有一个主界面,主界面上有一个文本为“Parent”的QGroupBox,“Parent”中包含了两个部件及另外一个文本为“Child”的QGroupBox,“Child”中包含了另外两个部件,它们之间的关系如下:

这里写图片描述

用程序实现一下,大概就是下面这个效果。

效果

这里写图片描述

源码

<code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 构建部件</span>QGroupBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>parentWidget <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QGroupBox(this);QGroupBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>subWidget <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QGroupBox(this);QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pCheckBox1 <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QCheckBox(parentWidget);QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pCheckBox2 <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QCheckBox(parentWidget);QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pCheckBox3 <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QCheckBox(subWidget);QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pCheckBox4 <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QCheckBox(subWidget);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置标题</span>parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setTitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Parent"</span>);subWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setTitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Child"</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 设置文本</span>pCheckBox1<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setText(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CheckBox1"</span>);pCheckBox2<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setText(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CheckBox2"</span>);pCheckBox3<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setText(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CheckBox3"</span>);pCheckBox4<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setText(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CheckBox4"</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 设置objectName</span>pCheckBox1<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setObjectName(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>);pCheckBox2<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setObjectName(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name1"</span>);pCheckBox3<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setObjectName(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>);pCheckBox4<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setObjectName(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name2"</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 为subWidget设置布局,这时pCheckBox3、pCheckBox4均为它的孩子</span>QVBoxLayout <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pSubLayout <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QVBoxLayout();pSubLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>addWidget(pCheckBox3);pSubLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>addWidget(pCheckBox4);pSubLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setSpacing(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);pSubLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setContentsMargins(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);subWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setLayout(pSubLayout);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 为parentWidget设置布局,这时pCheckBox1、pCheckBox2、以及subWidget均为它的孩子。</span>QVBoxLayout <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pLayout <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> QVBoxLayout();pLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>addWidget(pCheckBox1);pLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>addWidget(pCheckBox2);pLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>addWidget(subWidget);pLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setSpacing(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);pLayout<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setContentsMargins(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setLayout(pLayout);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li></ul>

到这里,如果对父子级联关系还有问题,你不妨可以调试一下看看:

<code class="language-Qt hljs scss has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << parentWidget;<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << checkBox1-><span class="hljs-function" style="box-sizing: border-box;">parent()</span>;<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << checkBox2-><span class="hljs-function" style="box-sizing: border-box;">parent()</span>;<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << subWidget-><span class="hljs-function" style="box-sizing: border-box;">parent()</span>;<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << "******************";<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << subWidget;<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << checkBox3-><span class="hljs-function" style="box-sizing: border-box;">parentWidget()</span>;<span class="hljs-function" style="box-sizing: border-box;">qDebug()</span> << checkBox4-><span class="hljs-function" style="box-sizing: border-box;">parentWidget()</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

输出如下:

<code class="language-Qt hljs scss has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802778)</span><span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802778)</span><span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802778)</span><span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802778)</span>******************<span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802a90)</span><span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802a90)</span><span class="hljs-function" style="box-sizing: border-box;">QGroupBox(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>x802a90)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

这说明什么情况?很显然:

  • checkBox3、checkBox4的直接父亲是subWidget。
  • checkBox1、checkBox2、subWidget的直接父亲是parentWidget。

由此可以确定,parentWidget是checkBox3、checkBox4的爷爷(祖先),O(∩_∩)O~。

可能情况

  • 返回NULL

    • 不能转换为类型T - 与Qt::FindChildOption取值无关。
    <code class="language-Qt hljs fix has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-attribute" style="box-sizing: border-box;">QPushButton *button </span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"> parentWidget->findChild<QPushButton *>();</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    parentWidget所有子孙部件中包含QGroupBox和QCheckBox,但是并没有QPushButton,所以无论是否递归搜索,均返回NULL。

    • 可以转换为类型T,但是对应的name不存在 - 与Qt::FindChildOption取值无关。
    <code class="language-Qt hljs haskell has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QCheckBox</span> *checkBox = parentWidget->findChild<<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QCheckBox</span> *>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Qt"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    parentWidget上有QCheckBox,但是没有名为“Qt”的,所以无论是否递归搜索,均返回NULL。

    • 可以转换为类型T,对应的name也存在(非直接孩子) - Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
    <code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>checkBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>findChild<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*></span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name2"</span>, Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::FindDirectChildrenOnly</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    parentWidget上有名为“name2”的QCheckBox,但是由于采用了Qt::FindDirectChildrenOnly,只会查找直接孩子,而直接孩子中只有名为“name”和“name1”的QCheckBox,所以返回NULL。

  • 返回非NULL

    硬性条件:

    1.可以转换为类型T。 
    2.对应的name存在(如果name为空字符串,此条件可忽略,只需要参考1)。

    • Qt::FindChildOption取值为Qt::FindChildrenRecursively。
    <code class="language-Qt hljs haskell has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QCheckBox</span> *checkBox1 = parentWidget->findChild<<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QCheckBox</span> *>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name1"</span>);<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QCheckBox</span> *checkBox2 = parentWidget->findChild<<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">QCheckBox</span> *>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name2"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    由于递归查找,当发现孩子中存在符合要求的就会终止,由于直接孩子中存在名为“name1”的QCheckBox,所以checkBox1表示文本为“CheckBox2”的QCheckBox;由于子孙孩子中存在名为“name2”的QCheckBox,所以checkBox2表示文本为“CheckBox4”的QCheckBox。

    • Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
    <code class="language-Qt hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>checkBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> parentWidget<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>findChild<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>QCheckBox <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*></span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>, Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::FindDirectChildrenOnly</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    由于采用了Qt::FindDirectChildrenOnly,只会查找parentWidget的直接孩子,直接孩子中存在名为“name”的QCheckBox,所以返回文本为“CheckBox1”的QCheckBox。

注意:

  1. 理解直接与非直接孩子的区别与关系(可以想象一下血缘关系)。
  2. name是按照objectName()来查找的,并不是text(),切勿搞错。

0 0
原创粉丝点击