Qt之findChild
在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。
Qt::FindChildOptions是一个QFlags FindChildOption 类型定义,它存储一个或FindChildOption的组合值。
返回对象中类型可以转换为T,并且名为name的孩子。如果不满足条件,则返回0。默认执行递归搜索,除非指定选FindDirectChildrenOnly。
T QObject::findChild(const QString name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
如果有一个以上的孩子匹配搜索,返回最直接的祖先。如果有几个直系祖先,没有定义哪一个将被返回。这种情况下,应该使用findChildren()。
这个示例,返回parentWidget中一个名为“button1”的QPushButton孩子,即使按钮不是父亲的直接孩子:
这个示例,返回parentWidget(它的直接父亲)中一个名为“button1”的QPushButton孩子:
QPushButton *button = parentWidget- findChild QPushButton * ("button1", Qt::FindDirectChildrenOnly);
这个示例,返回parentWidget(它的直接父亲)中的一个QListWidget孩子:
QListWidget *list = parentWidget- findChild QListWidget * (QString(), Qt::FindDirectChildrenOnly);
我们不妨来分析一下!
假如我们有一个主界面,主界面上有一个文本为“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();
输出如下:
checkBox3、checkBox4的直接父亲是subWidget。 checkBox1、checkBox2、subWidget的直接父亲是parentWidget。
由此可以确定,parentWidget是checkBox3、checkBox4的爷爷(祖先),O(∩_∩)O~。
不能转换为类型T - 与Qt::FindChildOption取值无关。
QPushButton *button = parentWidget- findChild QPushButton *
parentWidget所有子孙部件中包含QGroupBox和QCheckBox,但是并没有QPushButton,所以无论是否递归搜索,均返回NULL。
可以转换为类型T,但是对应的name不存在 - 与Qt::FindChildOption取值无关。QCheckBox *checkBox = parentWidget- findChild QCheckBox * ("Qt");
parentWidget上有QCheckBox,但是没有名为“Qt”的,所以无论是否递归搜索,均返回NULL。
可以转换为类型T,对应的name也存在(非直接孩子) - Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。QCheckBox *checkBox = parentWidget- findChild QCheckBox * ("name2", Qt::FindDirectChildrenOnly);
parentWidget上有名为“name2”的QCheckBox,但是由于采用了Qt::FindDirectChildrenOnly,只会查找直接孩子,而直接孩子中只有名为“name”和“name1”的QCheckBox,所以返回NULL。
1.可以转换为类型T。
2.对应的name存在(如果name为空字符串,此条件可忽略,只需要参考1)。
QCheckBox *checkBox1 = parentWidget- findChild QCheckBox * ("name1"); QCheckBox *checkBox2 = parentWidget- findChild QCheckBox * ("name2");
由于递归查找,当发现孩子中存在符合要求的就会终止,由于直接孩子中存在名为“name1”的QCheckBox,所以checkBox1表示文本为“CheckBox2”的QCheckBox;由于子孙孩子中存在名为“name2”的QCheckBox,所以checkBox2表示文本为“CheckBox4”的QCheckBox。
Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。QCheckBox *checkBox = parentWidget- findChild QCheckBox * ("name", Qt::FindDirectChildrenOnly);
由于采用了Qt::FindDirectChildrenOnly,只会查找parentWidget的直接孩子,直接孩子中存在名为“name”的QCheckBox,所以返回文本为“CheckBox1”的QCheckBox。
理解直接与非直接孩子的区别与关系(可以想象一下血缘关系)。 name是按照objectName()来查找的,并不是text(),切勿搞错。
QFuture 允许线程与一个或多个结果同步,这些结果将在稍后的时间点准备就绪,该结果可以是具有默认构造函数和拷贝构造函数的任何类型。如果一个结果在调用 result()、resultAt() 或 results() 函数时不可用,QFutur
QToolBox可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面。每个tab都在tab列中有一个索引位置。tab的item是一个QWidget 。
QDateEdit和QTimeEdit均继承自QDateTimeEdit,许多特性和功能都有QDateTimeEdit提供。这些都是相关属性:
虽然QLocalSocket是一个事件循环使用而设计,它也可以不被如此使用。这种情况下,必须使用 waitF
QLocalServer可以接受来自本地socket的连接。通过调用listen(),让server监听来自特定key的连接。 调用nextPendingConnection()来接受一个挂起(等待)的连接作为一个已连接的QLocalSocket。函数返一个QLocalSocket指针,可以被
滑块是一个用于控制有界值的典型部件。它允许用户沿水平或垂直方向移动滑块,并将滑块所在的位置转换成一个合法范围内的值。
QHostAddress通常与QTcpSocket、QTcpServer、QUdpSocket一起使用,来连接到主机或建立一个服务器。 可以通过setAddress()来设置一个主机地址,使用toIPv4Address()、toIPv6Address
现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。
相关文章
- Qt 嵌入浏览器 QWebEngineView实现浏览器基本功能
- 在Qt中使用全局变量的两种方式,及出现无法解析的命令的问题
- QT信号和槽
- Qt音视频开发30-qmedia内核qt4方案phonon播放(支持视频流)
- Qt编写地图综合应用56-实时动态轨迹
- Qt编写的项目作品28-视频监控显示安卓版
- Qt开源作品6-通用视频控件
- Qt编写的项目作品11-带频谱的音乐播放器
- Qt编写气体安全管理系统14-邮件转发
- Qt编写数据可视化大屏界面电子看板13-基础版
- Qt编写自定义控件10-云台仪表盘
- Qt网络模块如何使用(表格)
- Qt5.9 提供Qt Remote Objects,OAuth1 & OAuth2,重写了QML的GC
- Qt之线程基础
- Qt之qInstallMessageHandler(重定向至文件)
- Qt之QTemporaryFile
- Qt for S60 安装