Qt 父子对象的关系

简介: Qt 父子对象的关系

前言

Qt是一个流行的C++框架,用于开发跨平台的图形用户界面(GUI)应用程序。Qt提供了一种强大的对象模型,其中一个关键概念是对象间的父子关系。


一. Qt 对象可以存在父子关系:

在Qt中,对象间的父子关系是通过 QObject 类和对象树机制来实现的。每个QObject派生类都具有父子关系的能力。通过建立父子关系,可以形成一个层次结构,从而方便进行对象的管理和组织。

父子关系在Qt中有以下几个主要作用:

  1. 对象的内存管理:父对象负责管理其所有子对象的生命周期。当父对象被销毁时,它会自动销毁其所有子对象。这种自动释放内存的机制大大简化了对象资源的管理,减少了内存泄漏的风险。
  2. 信号与槽机制:父子关系对信号与槽机制的使用提供了便利。当一个对象发送信号时,其父对象可以接收并处理该信号。这种机制可以用于在对象之间进行通信和交互。
  3. 对象的查找和访问:通过父子关系,可以方便地查找和访问对象树中的对象。通过QObject的findChild()和findChildren()等函数,可以在对象树中根据对象名称、类型等条件查找对象,实现对象之间的联动和数据传递。

二. 父子关系的建立:

在Qt中建立父子关系很简单。可以通过在构造函数中传递父对象指针来建立对象间的父子关系,或者使用setParent( ) 函数来设置父对象。

示例代码:

QObject* parent = new QObject();    // 创建父对象
QObject* child = new QObject(parent);     // 创建子对象,并指定父对象
Qobject* p = new Qobject( );
Qobject* c1 = new Qobject ();
Q0bject* c2 = new Qobject ( );
c1->setParent (p) ;     // 指定父对象
c2->setParent (p);

Qt提供了几个函数来管理父子关系:

  • setParent ( ) :设置对象的父对象。
  • parent( ) :获取对象的父对象。
  • children( ) :获取对象的直接子对象。
  • findChild( ) 和 findChildren( ) :在对象树中查找对象。

当指定Qt 对象的父对象时:

- 其父对象会在子对象链表中加入该对象的指针

- 该对象会保存指向其父对象的指针

三. Qt 对象的销毁:

当父对象被销毁时,它会自动销毁其所有子对象。这种自动释放内存的机制大大简化了对象资源的管理,减少了内存泄漏的风险。

利用Qt对象间的父子关系可以构成对象树 。删除树中的节点时会导致对应的子树被销毁.

代码解析:

class My_Object : public QObject
{
    QString m_name;
public:
    My_Object(const QString& name)
    {
        m_name = name;
        qDebug() << "My_Object: " << m_name;
    }
    ~My_Object()
    {
        qDebug() << "~ My_Object: " << m_name;
    }
};
void Test()
{
    My_Object* obj1 = new My_Object("obj1");
    My_Object* obj2 = new My_Object("obj2");
    My_Object* obj3 = new My_Object("obj3");
    My_Object* obj4 = new My_Object("obj4");
    obj2->setParent(obj1);
    obj3->setParent(obj1);
    obj4->setParent(obj3);
    delete obj3;              // 销毁 obj3
    const QObjectList& list = obj1->children();
    qDebug() << "obj2: " << obj2;
//    qDebug() << "obj3: " << obj3;
    for(int i=0; i<list.length(); i++)      // 便利链表
    {
        qDebug() << list[i];
    }
   // delete obj4;              销毁 obj3 后 不可重复销毁 obj4
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Test();
  return a.exec();
}

销毁 obj3 后 :

链表 里 只有 obj2 的地址。

未 销毁 obj3 时:

链表 里 有 obj2 和 obj3 的地址。


总结

Qt对象间的父子关系是一种强大而便捷的机制,用于对象管理、内存释放、信号与槽机制和对象访问。通过建立父子关系,可以形成一个层次结构,简化对象的管理和组织。在使用父子关系时,需要注意对象的生命周期和内存管理,以确保正确且安全地使用这一特性。

相关文章
|
7月前
|
程序员
QT 官方QObject对象翻译要点(纯属个人翻译,不靠谱)
QT 官方QObject对象翻译要点(纯属个人翻译,不靠谱)
80 1
|
3月前
|
设计模式 前端开发 安全
Qt注册类对象单例与单类型区别
在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。
45 2
|
6月前
|
编译器 C++
(10)Qt对象模型
(10)Qt对象模型
|
6月前
|
前端开发
自定义QT QWidget对象响应弹出菜单的解决方法
自定义QT QWidget对象响应弹出菜单的解决方法
99 1
|
7月前
|
Java 程序员 测试技术
【Qt底层之内存管理机制】Qt 对象 父子关系、运行时机制与高效编程技巧
【Qt底层之内存管理机制】Qt 对象 父子关系、运行时机制与高效编程技巧
368 2
|
7月前
|
C++
【Qt】—— 对象模型的认识
【Qt】—— 对象模型的认识
|
7月前
|
编译器 C语言 C++
Qt6学习笔记一(安装、新建工程(cmake编译)、QPushButton、对象树、Qt窗口坐标系)
Qt6学习笔记一(安装、新建工程(cmake编译)、QPushButton、对象树、Qt窗口坐标系)
175 0
|
7月前
QT基础教学(QT对象间的关系)
QT基础教学(QT对象间的关系)
93 0
|
编译器 C++ Windows
[学习][笔记] qt5 从入门到入坟:<四>对象模型
[学习][笔记] qt5 从入门到入坟:<四>对象模型
QT编译警告 warning LNK4042: 对象被多次指定;已忽略多余的指定
QT编译警告 warning LNK4042: 对象被多次指定;已忽略多余的指定
282 0