Qt编程--发现小知识点,析构Object类时,自动析构其子对象

本文通过实例演示了在Qt中如何设置对象间的父子关系,以及这种关系如何影响对象的生命周期管理。当父对象被删除时,其所有子对象也会被自动删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习Qt时,发现,构造一个QObject对象A,并把另一个QObject对象B作为A的父对象传入,当析构对象A时,对象B也将被自动析构。


验证如下:

testobject1.h

#ifndef TESTOBJECT1
#define TESTOBJECT1
#include <QObject>
class TestObject : public QObject
{
    Q_OBJECT
public:
    explicit TestObject(QString objectName, QObject* parent = 0);
    ~TestObject();

    QString m_ObjectName;
};

#endif // TESTOBJECT1

testobject1.cpp

#include "testobject1.h"
#include <QDebug>


TestObject::TestObject(QString objectName, QObject* parent)
    :QObject(parent)
{
    m_ObjectName = objectName;
    qDebug()<<m_ObjectName<<"enter constuctor";
}

TestObject::~TestObject()
{
    qDebug()<<m_ObjectName<<"leave constuctor";
}


mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "testobject1.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    TestObject* m_testObject1;
    TestObject* m_testObject2;
public slots:
    void destroyTheObject();
};

#endif // MAINWINDOW_H




mainWindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //以下操作证明,将对父象传进去后,当父对象被析构时,其子对象也将被自动析构, 但不会自动为其赋NULL值。

    m_testObject1 = new TestObject("object1", this);

    m_testObject2 = new TestObject("object2", m_testObject1);

    connect(m_testObject2, &TestObject::destroyed, this, this->destroyTheObject);

//    if(m_testObject1)
//    {
//        delete m_testObject1;
//    }

//    if(NULL != m_testObject1)
//    {
//        qDebug()<<"the pointer of m_testObject1 is not null";
//    }
//    else
//    {
//        qDebug()<<"the pointer of m_testObject1 still  null";
//    }

//    if(NULL != m_testObject2)
//    {
//        qDebug()<<"the pointer of m_testObject2 is not null";
//    }
//    else
//    {
//        qDebug()<<"the pointer of m_testObject2 still  null";
//    }

    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    qDebug()<<"enter the main window destry function.";
    delete ui;

    if(NULL != m_testObject1)
    {
        qDebug()<<"the pointer of m_testObject1 is not null";
    }
    else
    {
        qDebug()<<"the pointer of m_testObject1 still  null";
    }

    if(NULL != m_testObject2)
    {
        qDebug()<<"the pointer of m_testObject2 is not null";
    }
    else
    {
        qDebug()<<"the pointer of m_testObject2 still  null";
    }
}

void MainWindow::destroyTheObject()
{
    if(m_testObject2)
    {
        qDebug()<<"make m_testObject2 to NULL";
        m_testObject2 = NULL;
    }
}



运行结果:

"object1" enter constuctor

"object2" enter constuctor

enter the main window destry function.

the pointer of m_testObject1 is not null

the pointer of m_testObject2 is not null

"object1" leave constuctor

"object2" leave constuctor

make m_testObject2 to NULL



### Qt 常用知识点总结 #### 1. **QObject ** `QObject` 是所有 Qt 对象的基,提供了信号与槽机制以及对象树功能。通过 `Q_OBJECT` 宏声明的对象可以支持这些特性[^1]。 #### 2. **QWidget ** `QWidget` 是 GUI 应用程序中的基本窗口组件。它是所有用户界面对象的基础。开发者可以通过继承该来创建自定义控件,并利用其内置的功能实现复杂的 UI 设计[^2]。 #### 3. **QPushButton 和其他按钮** `QPushButton` 提供了一个标准按钮控件,常用于触发事件处理逻辑。似的还有 `QRadioButton` 和 `QCheckBox`,分别表示单选按钮和复选框[^2]。 #### 4. **QLabel ** `QLabel` 显示文本或图像的小部件,通常用来展示静态信息或者作为其他交互元素的标签。 #### 5. **QLineEdit ** `QLineEdit` 提供了一行可编辑文本字段,适用于简单的数据输入场景。它可以设置验证器以限制用户的输入范围[^2]。 #### 6. **QTextEdit 和 QTextBrowser ** - `QTextEdit`: 支持富文本编辑的大区域文本显示/编辑控件。 - `QTextBrowser`: 只读版本的 `QTextEdit`,适合浏览文档内容[^2]。 #### 7. **QComboBox 和 QListWidget ** - `QComboBox`: 下拉列表框,允许用户从一组选项中选择一项。 - `QListWidget`: 列表视图小部件,提供一种简单的方式来管理项目集合[^2]。 #### 8. **QTableWidget 和 QTableView ** - `QTableWidget`: 表格形式的数据展示工具,基于项模型架建而成。 - `QTableView`: 更灵活的表格视图,配合 Model 使用能高效地呈现大规模数据集[^2]。 #### 9. **QDialog 和 QMainWindow ** - `QDialog`: 对话框基础,分为模态 (Modal) 和非模态 (Modeless) 两种模式运行方式。 - `QMainWindow`: 主应用程序窗口框架结的核心部分,包含菜单栏、工具条区等多个子组件布局位置预留接口。 #### 10. **QTimer ** 定器服务单元,在指定间间隔到达后发出 timeout() 信号通知关联接收方执行相应动作。 ```cpp // 示例:使用 QTimer 实现每秒打印日志 #include <QCoreApplication> #include <QTimer> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QObject::connect(&timer, &QTimer::timeout, [](){ qDebug() << "One second has passed"; }); timer.start(1000); // 设置超间为 1 秒钟 return a.exec(); } ``` #### 11. **QString 和 QByteArray ** 字符串处理方面的重要成员: - `QString`: Unicode 字符串容器,便于跨平台开发过程中保持一致编码格式; - `QByteArray`: 存储原始字节数组序列化后的二进制流数据非常方便实用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值