Qt学习及使用_第3部分_Qt框架功能概述---对象树

前言
        

        学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面.

        参考书:<Qt 6 C++开发指南>(以下称"本书"),继承关系沿用本书说法:父类/子类,而非传统C++使用基类/派生类

        标识说明:概念用粗体+倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字),

                        本书原话内容用深蓝色标识,比较重要的内容用加粗倾斜下划线深蓝色标识

引入

        Qt框架功能是本书的核心内容,本贴对象树

对象树

        在这一帖:Qt学习及使用_第3部分_Qt框架功能概述---模块&全局定义&元对象系统概述之QObject类-CSDN博客 中理解了对象树,本书P57的内容可以印证笔者的分析是基本正确,前贴有一个小问题:当属性类型是QObject*时表示对象树中的一个结点,而不是一维数组;当属性类型是vector<QObject*>表示一维数组,而不是二维数组,在对象树中表示任意多个结点.---对象树结点表示不需要二维数组.

对象树的由来

        本书P57第2段:使用QObject及其子类创建的对象(统称为QObject对象)是以对象树的形式来组织的.创建一个QObject对象时若设置一个父对象,他就会被添加到父对象的子对象列表中.一个父对象被删除时,其全部子对象就会被自动删除.

        ---解读:上面列重点的句子,实际上是一种需求:当父对象被删除时,其全部子对象就会被自动删除.而对象树是根据这种需求设计的程序模型.

        本书P57第3段:这种对象树的结构对于窗口上的对象管理特别有用.界面组件都有父对象,也就是组件的容器对象.对于不可见的QObject对象(如表示快捷方式的QShortcut对象)也可以设置窗口作为父对象.窗口是一个窗口对象树的最上层结点.当用户关闭并删除一个窗口时,窗口上的所有对象都会被自动删除.

        ---解读:关键在于所有的对象都是QObject的直接子类或间接子类对象.这里的父对象仍然是指"把当前对象包含在里面的对象",是包含关系而非继承关系.对象树用窗口做顶层结点,窗口对象或者其他什么类型对象,仍然都是QObject的直接或间接子类.

对象树的函数

        1.函数children()

        说明:返回对象的子对象(内含对象)列表,函数原型

const QObjectList &QObject::children()

        函数返回值是QObjectList类型,就是QObject类型的指针列表,定义如下:

typedef QList<QObject*> QObjectList;

        ---说明:笔者在上一篇帖子里定义的是vector<QObject*> ,和他是一样的,后面容器类有说明QList等于Qvector,而Qvector等于vector.

        本书没有提到QObject的声明,类比较庞大.他的基本结构里是这样实现对象树的

/*伪代码*/
class QObject{
    private:
        QObjectList ql;
        ....
    public:
        const QObjectList & children();    //返回内含对象列表,本来是模板函数,用普通函数替代
}

=============================内容分割线↓===================================

        笔者感觉有点受不了本书的写法了.约定此后的理解中,父子对象表示继承关系---和C++保持一致.包含关系中,包含内含对象的对象---本书中的"父对象"表述为:上级对象;被上级对象---本书中的"父对象"包含的对象表述为:内含对象

=============================内容分割线↑===================================

        本书P57代码注意的地方:

        1>分组框有4个按钮对象,1个布局对象---布局也是对象,并且也是QObject类型

        2>分组框被访问的方式

QObjectList objectList=ui->groupBox_Btns->children();

        其中"ui->groupBox_Btns"表示访问到了分组框,这种写法需要后面章节中的解读.

        2.函数findChild()

        这也是一个函数模板---调用时传入类型;递归查找---直到找到为止;示例代码:

/*查找窗口对象上对象名称为btnOK的QPushButton按钮*/
QPushButton* btn=this->findChild<QPushButton*>("btnOK");

        注意:输入对象类型对象名称.

        3.函数findChildren()

        本书P58说明:这个函数可以指定对象名称,还可以使用正则表达式.如果不设置查找对象的名称,则返回所有能转换为类型T的对象.

        指定对象名称查找

        这个函数的返回值是QList<T>,是一个集合.在查找单个对象时,和findChild()相似.这里有点奇怪,难道在内含对象中有多个同名的同类型对象吗?所以findChildren()查找对象要具体实践才知道.

        有一种可能场景:窗口A内含有QPushButton的对象和另一个窗口B,窗口B中也有QPushButton的对象,此时用findChildren(),指定对象类型和对象名称的方法查找,得到一个QList<QPushButton*>对象,然后再遍历,调用元数据或者className方法获得其名,或者调用取得上级对象的方法去区分.

        和findChild()对比起来,findChildren()支持正则表达式.在查找单个对象的时候可能用得上.

        集合查找

        本书P58的代码,指定内含对象类型,查找该类型列表.

        findChildren()和Children()函数的联系:调用Children()等同于调用findChildren<QObject*>

对象树函数的选择

        1>使用children()查找整个内含对象列表

        2>使用findChild()查找已知类型和已知名称的某个对象

        3>使用findChildren()查找某已知类型所有对象.

小结

        对象树是一种程序模型,满足了"当删除一个对象,把其内含对象全部删除"的需求.在Qt中由QObject的类型定义而实现.可想而知在其他C++框架里同样可以用对象树.

        对象树中所有的对象都是QObject类的直接或间接子类对象,这是实现的关键.

        从内容的角度来看,对象树可以表达从0到无限的内容,每层内容由继承关系添加,而且之前添加的内容随时加入继承序列中---类似"自举";所以对象树可以说是比较"神奇"的.

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重庆彭枫

你的鼓励是我创作的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值