Qt查找孩子findChild
转载自【http://blog.csdn.net/liang19890820/article/details/52118210】
简述
在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。
查找选项
- 枚举Qt::FindChildOption:
Qt::FindChildOptions是一个QFlags<FindChildOption>类型定义,它存储一个或FindChildOption的组合值。
| 常量 | 值 | 描述 |
|---|---|---|
| Qt::FindDirectChildrenOnly | 0x0 | 查找object的直接孩子 |
| Qt::FindChildrenRecursively | 0x1 | 查找object的所有孩子(递归搜索) |
findChild
描述
返回对象中类型可以转换为T,并且名为name的孩子。如果不满足条件,则返回0。默认执行递归搜索,除非指定选FindDirectChildrenOnly。
T QObject::findChild(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
- 1
如果有一个以上的孩子匹配搜索,返回最直接的祖先。如果有几个直系祖先,没有定义哪一个将被返回。这种情况下,应该使用findChildren()。
示例
这个示例,返回parentWidget中一个名为“button1”的QPushButton孩子,即使按钮不是父亲的直接孩子:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
- 1
这个示例,返回parentWidget中的一个QListWidget孩子:
QListWidget *list = parentWidget->findChild<QListWidget *>();
- 1
这个示例,返回parentWidget(它的直接父亲)中一个名为“button1”的QPushButton孩子:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);
- 1
这个示例,返回parentWidget(它的直接父亲)中的一个QListWidget孩子:
QListWidget *list = parentWidget->findChild<QListWidget *>(QString(), Qt::FindDirectChildrenOnly);
- 1
我们不妨来分析一下!
分析
假如我们有一个主界面,主界面上有一个文本为“Parent”的QGroupBox,“Parent”中包含了两个部件及另外一个文本为“Child”的QGroupBox,“Child”中包含了另外两个部件,它们之间的关系如下:
用程序实现一下,大概就是下面这个效果。
效果
源码
// 构建部件
QGroupBox *parentWidget = new QGroupBox(this);
QGroupBox *subWidget = new QGroupBox(this);
QCheckBox *pCheckBox1 = new QCheckBox(parentWidget);
QCheckBox *pCheckBox2 = new QCheckBox(parentWidget);
QCheckBox *pCheckBox3 = new QCheckBox(subWidget);
QCheckBox *pCheckBox4 = new QCheckBox(subWidget);
//设置标题
parentWidget->setTitle("Parent");
subWidget->setTitle("Child");
// 设置文本
pCheckBox1->setText("CheckBox1");
pCheckBox2->setText("CheckBox2");
pCheckBox3->setText("CheckBox3");
pCheckBox4->setText("CheckBox4");
// 设置objectName
pCheckBox1->setObjectName("name");
pCheckBox2->setObjectName("name1");
pCheckBox3->setObjectName("name");
pCheckBox4->setObjectName("name2");
// 为subWidget设置布局,这时pCheckBox3、pCheckBox4均为它的孩子
QVBoxLayout *pSubLayout = new QVBoxLayout();
pSubLayout->addWidget(pCheckBox3);
pSubLayout->addWidget(pCheckBox4);
pSubLayout->setSpacing(10);
pSubLayout->setContentsMargins(10, 10, 10, 10);
subWidget->setLayout(pSubLayout);
// 为parentWidget设置布局,这时pCheckBox1、pCheckBox2、以及subWidget均为它的孩子。
QVBoxLayout *pLayout = new QVBoxLayout();
pLayout->addWidget(pCheckBox1);
pLayout->addWidget(pCheckBox2);
pLayout->addWidget(subWidget);
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);
parentWidget->setLayout(pLayout);
到这里,如果对父子级联关系还有问题,你不妨可以调试一下看看:
qDebug() << parentWidget;
qDebug() << checkBox1->parent();
qDebug() << checkBox2->parent();
qDebug() << subWidget->parent();
qDebug() << "******************";
qDebug() << subWidget;
qDebug() << checkBox3->parentWidget();
qDebug() << checkBox4->parentWidget();
输出如下:
QGroupBox(0x802778)
QGroupBox(0x802778)
QGroupBox(0x802778)
QGroupBox(0x802778)
******************
QGroupBox(0x802a90)
QGroupBox(0x802a90)
QGroupBox(0x802a90)
这说明什么情况?很显然:
- checkBox3、checkBox4的直接父亲是subWidget。
- checkBox1、checkBox2、subWidget的直接父亲是parentWidget。
由此可以确定,parentWidget是checkBox3、checkBox4的爷爷(祖先),O(∩_∩)O~。
可能情况
返回NULL
- 不能转换为类型T - 与Qt::FindChildOption取值无关。
QPushButton *button = parentWidget->findChild<QPushButton *>();- 1
parentWidget所有子孙部件中包含QGroupBox和QCheckBox,但是并没有QPushButton,所以无论是否递归搜索,均返回NULL。
- 可以转换为类型T,但是对应的name不存在 - 与Qt::FindChildOption取值无关。
QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("Qt");- 1
parentWidget上有QCheckBox,但是没有名为“Qt”的,所以无论是否递归搜索,均返回NULL。
- 可以转换为类型T,对应的name也存在(非直接孩子) - Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("name2", Qt::FindDirectChildrenOnly);- 1
parentWidget上有名为“name2”的QCheckBox,但是由于采用了
Qt::FindDirectChildrenOnly,只会查找直接孩子,而直接孩子中只有名为“name”和“name1”的QCheckBox,所以返回NULL。返回非NULL
硬性条件:
1.可以转换为类型T。
2.对应的name存在(如果name为空字符串,此条件可忽略,只需要参考1)。- Qt::FindChildOption取值为Qt::FindChildrenRecursively。
QCheckBox *checkBox1 = parentWidget->findChild<QCheckBox *>("name1");
QCheckBox *checkBox2 = parentWidget->findChild<QCheckBox *>("name2");- 1
- 2
由于递归查找,当发现孩子中存在符合要求的就会终止,由于直接孩子中存在名为“name1”的QCheckBox,所以checkBox1表示文本为“CheckBox2”的QCheckBox;由于子孙孩子中存在名为“name2”的QCheckBox,所以checkBox2表示文本为“CheckBox4”的QCheckBox。
- Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("name", Qt::FindDirectChildrenOnly);- 1
由于采用了
Qt::FindDirectChildrenOnly,只会查找parentWidget的直接孩子,直接孩子中存在名为“name”的QCheckBox,所以返回文本为“CheckBox1”的QCheckBox。
注意:
- 理解直接与非直接孩子的区别与关系(可以想象一下血缘关系)。
- name是按照objectName()来查找的,并不是text(),切勿搞错。
Qt查找孩子findChild的更多相关文章
- JS查找孩子节点
以前看了JS方面的书,如今用到了,书看得再多,不用就忘了,所以经常用用你所学到的知识,温故知新. <!DOCTYPE html> <html> <head> < ...
- Qt 查找功能
版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语 这一篇我们来加上查找菜单的功能.因为要涉及Qt Creator的很多实用功 ...
- 通过QT查找Word中的关键字,并做高亮或删除操作
最近由于项目需要,要用QT操作Word文档.具体的工作需求:在指定的Word文档(*.doc文件/*.docx文件)中查找关键字,找到后做高亮操作或者直接删除操作,然后另存为到别的目录(表示这个文件被 ...
- qt查找框设置
转载请注明出处:http://www.cnblogs.com/dachen408/p/7229129.html 主界面弹出查找框方法,查找框显示在主界面上层,并还可以点击主界面,非模态. class ...
- Qt之findChild
简述 在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -"查找孩子". 简述 查 ...
- jQuery的offset、position、scroll,元素尺寸、对象过滤、查找、文档处理
jQuery_offset和position var offset = $('.xxx').offset() console.log(offset.left.,offset.top)xxx相对于页面左 ...
- jQuery之元素查找
在已经匹配出的元素集合中根据选择器查找孩子/父母/兄弟标签1. children(): 子标签中找2. find() : 后代标签中找3. parent() : 父标签4. prevAll() : 前 ...
- Java数据结构(十五)—— 多路查找树
多路查找树 二叉树和B树 二叉树的问题分析 二叉树操作效率高 二叉树需要加载到内存,若二叉树的节点多存在如下问题: 问题1:构建二叉树时,需多次进行I/O操作,对与速度有影响 问题2:节点海量造成二叉 ...
- 使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)
一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序 Visual Studio刚发布时没打补丁,称为RTM版,之后会陆续发布补丁,进行bug修复和功能增强.VS2010及之前 ...
随机推荐
- Java Base64解析
最近在业务场景中,需要对第三方传递进来的字符进行base64解密,根据第三方文档提供的解析工具,对数据进行了解析,关于Base64的解析方式如下: String sign = "xxxxxx ...
- 洛谷oj U3936(分成回文串) 邀请码:a0c9
题目链接:传送门 题目大意:略 题目思路:DP 先预处理,分别以每个字母为中心处理能形成的回文串,再以两个字母为中心处理能形成的回文串. 然后 dp[i] 表示1~i 能形成的数目最少的回文串. 转移 ...
- JZOJ.3777【NOI2015模拟8.17】最短路(shortest)
Description 小Y最近学得了最短路算法,一直想找个机会好好练习一下.话虽这么说,OJ上最短路的题目都被他刷光了.正巧他的好朋友小A正在研究一类奇怪的图,他也想凑上去求下它的最短 ...
- ITMS-SERVICES://方式安装IPA在IOS 7.1中的变化
转:https://laoyur.com/?p=414 iOS7.1中,通过itms-services://方式安装ipa已经发生了改变,.plist文件必须是https://的,.ipa文件的链接则 ...
- 关于Z序的总结
//转自:http://blog.csdn.net/flowshell/article/details/4797917 Z 序:一个重叠窗口的堆,每个窗口在Z 序中 都有唯一一个位置.一个窗口的Z 序 ...
- mysql几种引擎和使用场景
https://blog.csdn.net/cool_wayen/article/details/79585277 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建. ...
- 列表(List) 的增删改查及其他方法
一.列表的简介 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...
- 流畅的python 字典和集合
介绍 dict 类型不但在各种程序里广泛使用,它也是 Python 语言的基石.模块的命名空间.实例的属性和函数的关键字参数中都可以看到字典的身影.跟它有关的内置函数都在 __builtins__._ ...
- python 作用域知识点整理
1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? 1 2 3 4 5 6 7 8 9 10 11 12 #块级作用域 if 1 == 1: name = "lzl ...
- springMvc获取特殊值
1.获取数组