QT基础教学(QT对象间的关系)

news2024/11/26 2:36:18

文章目录

  • 前言
  • 一、QT间的父子关系
  • 二、聚合关系
  • 三、组合关系
  • 四、关联关系
  • 五、依赖关系
  • 总结


前言

本篇文章我们来讲解QT对象间的关系,理清楚QT对象间的关系是非常重要的,没有理清楚QT间的对象关系可能会导致内存的泄漏等各种问题的出现。

资料合集地微信公众号:优质程序猿

一、QT间的父子关系

在Qt中,父子关系是一种重要的概念,用于管理对象之间的层次结构和对象的生命周期。父子关系是通过设置对象的父对象来建立的。

在Qt中,每个QObject及其派生类都可以具有一个父对象。当一个对象被设置为另一个对象的父对象时,父对象负责管理其子对象的内存释放和生命周期。

以下是Qt中父子关系的几个重要方面:

1.层次结构:
通过将一个对象设置为另一个对象的父对象,您可以创建一个层次结构的对象组织结构。一个父对象可以有多个子对象,但一个子对象只能有一个父对象。

示例:

QWidget* parentWidget = new QWidget;
QLabel* childLabel = new QLabel(parentWidget);

在上述示例中,创建了一个QWidget对象作为父对象,并创建了一个QLabel对象,将其设置为父对象的子对象。当父对象被销毁时,所有的子对象也会被自动销毁。

2.内存管理:
通过设置一个对象的父对象,父对象将负责管理其子对象的内存释放。当父对象被销毁时,会自动销毁其所有的子对象。

示例:

QWidget* parentWidget = new QWidget;
QLabel* childLabel = new QLabel(parentWidget);
delete parentWidget;  // 删除父对象

在上述示例中,删除父对象parentWidget时,Qt会自动删除其子对象childLabel,无需手动释放内存。

树形结构遍历:
通过父子关系,可以创建一个对象的树形结构,通过父对象可以遍历整个树来访问和操作子对象。

示例:

QWidget* parentWidget = new QWidget;
QLabel* childLabel = new QLabel(parentWidget);

// 遍历子对象
foreach (QObject* child, parentWidget->children()) {
    QLabel* label = qobject_cast<QLabel*>(child);
    if (label) {
        // 对子对象进行操作
        label->setText("Hello!");
    }
}

在上述示例中,通过parentWidget->children()获取父对象的所有子对象,并使用qobject_cast进行类型转换。这使得可以方便地遍历整个对象树,访问和操作子对象。

父子关系在Qt的对象模型中起到了重要的作用,它简化了对象的管理和内存释放工作,并提供了方便的对象组织结构和访问方式。了解和使用父子关系对于Qt的开发非常重要。

对象间的父子关系:
在这里插入图片描述
销毁父对象后子对象也会被对应销毁:
在这里插入图片描述

二、聚合关系

聚合关系(Aggregation Relationship):
聚合关系表示一个对象包含了其他对象作为其一部分,但这些对象可以独立存在。聚合关系通常表现为一个对象作为另一个对象的成员变量。聚合关系中的对象之间没有明确的所有权关系。当包含的对象被销毁时,它们的内存管理由各自的拥有者负责。

#include <QList>

class Car {
public:
    // ...
private:
    QStringList passengers;
};

int main()
{
    Car car;
    car.passengers << "Alice" << "Bob";

    // ...
    return 0;
}

三、组合关系

组合关系(Composition Relationship):
组合关系是聚合关系的一种特殊形式,表示一个对象是另一个对象的一部分,两者的生命周期紧密相关。组合关系通常表现为一个对象作为另一个对象的成员变量,并在组合对象被销毁时,成员对象也会被销毁。在Qt中,通常通过使用智能指针(如QSharedPointer)来管理组合关系。

#include <QSharedPointer>

class Engine {  // 引擎类
public:
    // ...
};

class Car {
public:
    Car() : engine(new Engine()) {}  // Car拥有一个引擎对象

private:
    QSharedPointer<Engine> engine;
};

int main()
{
    Car car;
    // ...

    // 当car对象被销毁时,引擎对象也会被销毁
    return 0;
}

四、关联关系

关联关系(Association Relationship):
关联关系表示一个对象与其他对象之间存在某种关联或连接,但彼此之间没有拥有关系。关联关系可以是双向的或单向的。通常通过指针或引用来建立关联关系。

class Teacher;  // 前向声明

class Student {
public:
    Student(Teacher* teacher) : myTeacher(teacher) {}  // 关联到一个教师对象

private:
    Teacher* myTeacher;
};

class Teacher {
public:
    Teacher(const QList<Student*>& students) : myStudents(students) {}  // 与多个学生对象关联

private:
    QList<Student*> myStudents;
};

int main()
{
    Teacher teacher;
    Student student(&teacher);
    // ...

    return 0;
}

五、依赖关系

依赖关系(Dependency Relationship):
依赖关系表示一个对象在某种程度上依赖于另一个对象,但两者之间并没有直接的拥有或包含关系。依赖关系通常用于表示一个对象需要使用另一个对象的功能或服务。

class Logger {
public:
    void log(const QString& message) {
        // 日志记录功能
    }
};

class UserManager {
public:
    UserManager(Logger& logger) : log(logger) {}  // 依赖Logger对象进行日志记录

    void addUser(const QString& username, const QString& password) {
        // 用户添加逻辑

        log.log("User added: " + username);  // 使用Logger对象进行日志记录
    }

private:
    Logger& log;
};

int main()
{
    Logger logger;
    UserManager manager(logger);
    manager.addUser("Alice", "123456");

    return 0;
}

总结

本篇文章就讲解到这里,大家看完文章后可以对上面讲解的知识进行复习巩固。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS开发:那些开发中常见的问题汇总(一)

前言 本来这篇文章需要讲述静态共享包如何实现远程依赖和上传以及关于静态共享包私服的搭建&#xff0c;非常遗憾的告诉大家&#xff0c;由于组织管理申请迟迟未通过&#xff0c;和部分文档官方权限暂未开放&#xff0c;关于这方面的讲解需要延后了&#xff0c;大概需要等到202…

HeyFriday AI:智能AI写作工具

【产品介绍】​ 名称 HeyFriday AI 具体描述​ HeyFriday是一款智能AI写作工具&#xff0c;可以帮助用户快速生成博客、广告、创意故事等各种类型的文本内容&#xff0c;节省时间和金钱。​HeyFriday的团队由前谷歌NLP科学家&#xff08;ALBERT的第一作者&#xff…

VIRTIO-BLK代码分析(5)virtqueue通信

virtqueue用于VIRTIO驱动和VIRTIO设备进行通信。每个VIRTIO设备可能有一个或多个virtqueue&#xff0c;VIRTIO-BLK的virtqueue数目可以通过num_queues设置。 通过函数vring_create_virtqueue创建virtqueue&#xff0c;通过函数virtqueue_add_sgs添加数据。目前存在split virtqu…

【网络编程】UDP Socket编程

UDP Socket编程 一. DatagramSocket二. DatagramPacket三. InetSocketAddress四. 执行流程五. 代码示例: UDP 回显服务器 数据报套接字&#xff1a; 使用传输层 UDP 协议 UDP: 即 User Datagram Protocol&#xff08;用户数据报协议&#xff09;&#xff0c;传输层协议。 UDP…

Jmeter系列-定时器Timers的基本介绍(11)

简介 JMeter中的定时器&#xff08;Timer&#xff09;是一种重要的元件&#xff0c;用于模拟用户在不同时间间隔内发送请求的场景。通过使用定时器&#xff0c;可以模拟负载、并发和容量等不同情况下的请求发送频率。 使用定时器 可以在取样器下添加定时器&#xff0c;这样定…

机器学习第五课--广告点击率预测项目以及特征选择的介绍

这个项目的主要的目的是通过给定的广告信息和用户信息来预测一个广告被点击与否。 如果广告有很大概率被点击就展示广告&#xff0c;如果概率低&#xff0c;就不展示。 因为如果广告没有被点击&#xff0c;对双方&#xff08;广告主、平台&#xff09;来讲都没有好处。所以预测…

应用商店优化之关键词优化指南1

提高我们应用在应用商店中的知名度&#xff0c;完全取决于关键词。找到一些关键词的策略之后&#xff0c;我们应该选择最有前途的关键词并对其进行研究&#xff0c;从而创建新的组合和长尾关键词。 1、寻找关键词&#xff0c;找到一些潜在的关键词创意。 尝试考虑一下我们将如…

Element表格之表头合并、单元格合并

一、合并表头 el-table配置 :header-cell-style"headFirst"headFirst({ row, colunm, rowIndex, columnIndex }) {let base { background-color: rgba(67, 137, 249, 0.3), color: #333, text-align: center };//这里为了是将第一列的表头隐藏&#xff0c;就形成了合…

Python开发环境配置

Python 作为一个语言&#xff0c;代码需要一个解释器来进行解释&#xff0c;这个解析器就是专门针对 Python 代码的&#xff0c;只有它才知道这些代码是什么意思。编写代码也需要一定的工具&#xff0c;理论上所有的纯文本都可以编写代码&#xff0c;但工欲善其事必先利其器&am…

Python 办公自动化之 PDF 操作详解

1、PyMuPDF简介 1. 介绍 在介绍PyMuPDF之前&#xff0c;先来了解一下MuPDF&#xff0c;从命名形式中就可以看出&#xff0c;PyMuPDF是MuPDF的Python接口形式。 MuPDF MuPDF 是一个轻量级的 PDF、XPS和电子书查看器。MuPDF 由软件库、命令行工具和各种平台的查看器组成。 M…

安卓修改rom 移植rom必备常识 lib--**so文件基本解析

安卓系统lib-so文件 解包安卓固件中lib lib64分区下存在很多后缀为so的文件&#xff0c;其实都是系统的动态库&#xff0c;类似于win下面的*.dll&#xff0c;一般是由C/C编译成的动态库.在系统lib的文件夹下&#xff0c;置换移植其他系统的程序也需要修改更换相关so文件.没有它…

Android---底部弹窗之BottomSheetDialog

BottomSheetDialog 是Android开发中的一个弹出式对话框&#xff0c;它从屏幕底部弹出并覆盖部分主界面。 1. BottomSheetDialog的使用 // 参数2&#xff1a;设置BottomSheetDialog的主题样式&#xff1b;将背景设置为transparent&#xff0c;这样我们写的shape_bottom_sheet_…

C【函数】

1.常用API 1.strcpy&#xff1a;#include<string.h> char * strcpy ( char * destination, const char * source );int main(){char arr1[] "bit";char arr2[20] "###########";// bit\0########strcpy(arr2, arr1);printf("…

ChatGPT的未来

随着人工智能的快速发展&#xff0c;ChatGPT作为一种自然语言生成模型&#xff0c;在各个领域都展现出了巨大的潜力。它不仅可以用于日常对话、创意助手和知识查询&#xff0c;还可以应用于教育、医疗、商业等各个领域&#xff0c;为人们带来更多便利和创新。 在教育领域&#…

【刷题篇】贪心算法(二)

文章目录 找出工作所需最短时间活动选择无重叠区间 找出工作所需最短时间 某工厂有n个独立的作业&#xff0c;由m台相同的机器进行加工处理。作业i所需的加工时间为ti&#xff0c;任何作业在被处理时不能中断&#xff0c;也不能进行拆分处理。现厂长请你给他写一个程序:算出n个…

LLM 04-大模型的数据

LLM 03-大模型的数据 到目前为止&#xff0c;我们已经讨论了大型语言模型的行为&#xff08;能力和损害&#xff09;。现在&#xff0c;我们要剥开洋葱的第一层&#xff0c;开始讨论这些模型是如何构建的。任何机器学习方法的起点都是训练数据&#xff0c;因此这就是我们开始的…

JDK10特性

文章目录 JAVA10概述语法层次的变化局部变量的类型推断不能使用类型推断的场景变量的声明初始值nulllambda表达式方法引用为数组静态初始化成员变量不能使用其他不可以的场景 API层次的变化集合的copyOf方法 总结 JAVA10概述 2018年3月21日&#xff0c;Oracle官方宣布JAVA10正…

sizeof和strlen求取数组指针之辨析

目录 一维数组中sizeof Vs strlen 整型数组sizeof 字符数组 sizeof strlen 字符串数组 sizeof strlen 字符串的指针char *p sizeof strlen 二维数组中sizeof 今天主要来讲题目主要是数组&指针辨析题和笔试题。&#x1f197;最近心情有点焦虑。大家一定专注…

进阶测试知识之风险基础测试

风险基础测试&#xff08;Risk-Based Testing&#xff09;是一种测试策略&#xff0c;其主要思想是根据产品或系统中各个部分的风险程度来优先进行测试。风险通常是由两个因素决定的&#xff1a;一是问题&#xff08;如缺陷或错误&#xff09;发生的可能性&#xff0c;二是如果…

嵌入式入门教学——模电基础概念

目录 1、模拟信号和模拟电路 2、研究领域 3、常用术语 3.1、共价键 3.2、电场 3.3、温度的电压当量 3.4、动态信号 3.5、直流电流和交流电流 3.6、内阻 3.7、信号频率 3.8、电容 3.9、电感 3.10、相位 3.11、信号失真 3.12、电导 3.13、跨导 3.14、电位 3.15…