Qt 中父子关系使用总结

2023-11-17

背景

Qt 中到父子关系和类的继承无关,仅表示对象间到从属关系;继承自 QObject 的对象在构造时需要指定父对象指针:

#include <QObject>
#include "QDebug"

class QtClassDemo : public QObject
{
  Q_OBJECT

public:
  QtClassDemo(QObject *parent) : QObject(parent) {};
  ~QtClassDemo()
  {
    qDebug() << QString("%1析构").arg(this->property("objectName").toString());
  };
};

设置父对象

①.概述

继承自 QObject 的对象在构造时需要传入父对象指针,会自动在其子对象列表中会增加该子对象指针。

②.代码示例

qDebug() << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(this);
parrentObj->setProperty("objectName", "父对象");
qDebug() << QString("子对象数量:%1").arg(parrentObj->children().size()) << endl;
    
qDebug() << "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");
qDebug() << QString("子对象数量:%1").arg(parrentObj->children().size()) << endl;

qDebug() << "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");
qDebug() << QString("子对象数量:%1").arg(parrentObj->children().size()) << endl;
  
qDebug() << "遍历所有子对象:";
for ( auto & child : parrentObj->children())
{
  qDebug() << child;
}

在这里插入图片描述

删除子对象

①.概述

继承自 QObject 的对象在析构时,会自动在其父对象到子节点列表中会删除该对象指针。

②.代码示例

qDebug() << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(this);
parrentObj->setProperty("objectName", "父对象");
qDebug() << QString("子对象数量:%1").arg(parrentObj->children().size()) << endl;
  
qDebug() << "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");
qDebug() << QString("子对象数量:%1").arg(parrentObj->children().size()) << endl;

qDebug() << "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");
qDebug() << QString("子对象数量:%1").arg(parrentObj->children().size()) << endl;
  
qDebug() << "遍历所有子对象:";
for ( auto & child : parrentObj->children())
{
  qDebug() << child;
}

qDebug() <<endl << "删除子对象1" << endl;
delete childObj1; childObj1 = nullptr;

qDebug() << "遍历所有子对象:";
for (auto & child : parrentObj->children())
{
  qDebug() << child;
}

在这里插入图片描述

删除父对象

①.概述

继承自 QObject 的对象在删除时,会自动删除其子对象列表中的所有对象。

②.代码示例

qDebug() << endl << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(this);
parrentObj->setProperty("objectName", "父对象");
  
qDebug() << endl << "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");

qDebug() << endl << "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");
  

qDebug() << endl << "遍历所有子对象:";
for ( auto & child : parrentObj->children())
{
  qDebug() << child;
}

qDebug() << endl << "删除父对象" << endl;
delete parrentObj; parrentObj = nullptr;

在这里插入图片描述

查找子对象

①.概述

继承自 QObject 的对象可以根据名称对其子对象进行查找。

②.查找单个子对象

qDebug() << endl << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(this);
parrentObj->setProperty("objectName", "父对象");
  
qDebug() << endl << "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");

qDebug() << endl << "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");
  
qDebug() << endl << "查找子对象2:";
QtClassDemo * child = parrentObj->findChild<QtClassDemo *>("子对象2");
if( child)
  qDebug() << "查找成功," << child;

在这里插入图片描述

③.查找多个子对象

qDebug() << endl << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(this);
parrentObj->setProperty("objectName", "父对象");
  
qDebug() << endl << "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");

qDebug() << endl << "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");
  
qDebug() << endl << "查找所有 QtClassDemo 类型到子对象:";
for (auto & child : parrentObj->findChildren<QtClassDemo *>())
{
  qDebug()  << child;
}

在这里插入图片描述

移动工作线程

①.概述

继承自 QObject 的对象可以通过 moveToThread 更改工作线程。

②.存在父对象则不允许移动

QtClassDemo * demoObj = new QtClassDemo(this);
QThread  * thread = new QThread;
demoObj->moveToThread(thread);

在这里插入图片描述

③.子对象跟随父对象一起移动

qDebug() << endl << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(nullptr);
parrentObj->setProperty("objectName", "父对象");

qDebug() <<  "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");

qDebug() <<  "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");

qDebug() << endl << "移动工作线程";
QThread  * thread = new QThread;
parrentObj->moveToThread(thread);

qDebug() << "当前线程:" << this->thread();
qDebug() << "父对象线程:" << parrentObj->thread();
qDebug() << "子对象1线程:" << childObj1->thread();
qDebug() << "子对象2线程:" << childObj2->thread();

在这里插入图片描述

父子关系注意事项

①.概述

继承自 QObject 的对象在删除时会自动删除其子对象,因此需要确保对象的删除顺序。

②.父对象删除后子对象指针并不为空

由于父对象删除后子对象指针并不为空,因此需要注意可能存在再次使用的情况。

qDebug() << endl << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(nullptr);
parrentObj->setProperty("objectName", "父对象");

qDebug() <<  "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");

qDebug() <<  "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");

qDebug() << endl << "删除父对象" << endl;
delete parrentObj; parrentObj = nullptr;

qDebug() << endl << "childObj1 ;" << static_cast<void*>(childObj1);

在这里插入图片描述

③.防止多次删除对象

由于父对象删除后子对象会自动删除,因此需要注意重复删除到情况,如栈对象、智能指针等自动管理到对象。

qDebug() << endl << "创建父对象";
QtClassDemo * parrentObj = new QtClassDemo(nullptr);
parrentObj->setProperty("objectName", "父对象");

qDebug() <<  "创建子对象1";
QtClassDemo * childObj1 = new QtClassDemo(parrentObj);
childObj1->setProperty("objectName", "子对象1");
  
QSharedPointer<QtClassDemo> p = QSharedPointer<QtClassDemo>(childObj1);
  
qDebug() <<  "创建子对象2";
QtClassDemo * childObj2 = new QtClassDemo(parrentObj);
childObj2->setProperty("objectName", "子对象2");

qDebug() << endl << "删除父对象" << endl;
delete parrentObj; parrentObj = nullptr;

在这里插入图片描述

布局管理器和父子关系

①.给布局管理器指定父对象

在创建布局管理器时,若直接指定类父对象,则相当于对父对象执行了 setLayout 方法。

qDebug() << "初始的布局管理器:" << this->layout();
QHBoxLayout * layout = new QHBoxLayout(this);
qDebug() << "创建的布局管理器:" << layout;
qDebug() << "当前的布局管理器:" << this->layout();

在这里插入图片描述

②.布局管理器默认给其管理到对象添加父对象

qDebug() << "this 指针:" << this;
QHBoxLayout * layout = new QHBoxLayout();
QPushButton * thn = new QPushButton;
layout->addWidget(thn);
qDebug() << "thn 父对象指针:" << thn->parent();
this->setLayout(layout);
qDebug() << "thn 父对象指针:" << thn->parent();

在这里插入图片描述

QWidget 和父子关系

①.概述

qwidget 对 QObject 的父子关系进行类扩充,可以根据位置查找其子对象。

②.代码示例

QHBoxLayout * layout = new QHBoxLayout(this);
QLabel * label1 = new QLabel("标签1",this);
label1->setObjectName("标签1");
QLabel * label2 = new QLabel("标签2", this);
label2->setObjectName("标签2");
QLabel * label3 = new QLabel("标签3", this);
label3->setObjectName("标签3");
layout->addWidget(label1);
layout->addWidget(label2);
layout->addWidget(label3);

void QtGuiApplication1::mousePressEvent(QMouseEvent *event)
{
  auto child = this->childAt(event->x(), event->y());
  if (child)
    qDebug() << child;
}

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 中父子关系使用总结 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • Numpy中的argsort函数详解

    Numpy中的argsort函数返回的是每个元素的排序序号 但是不是很容易理解 gt gt gt dd mat 4 5 1 gt gt gt dd argsort matrix 2 0 1 一开始的时候想不明白为什么是2 0 1而不是1 2
  • 链表作业 3:多项式加法

    题目描述 实现两个一元n次多项式的加法 例如P A x 3x2 5x5 7 P B 2x2 6x3 x5 4x6 求P A P B 输入 每行是两个用空格隔开的整数m n 分别代表多项式的系数和指数 以输入0 0作为结尾 输出 每次完成一个
  • vue elementUI 日期组件 默认当前月份第一天 与 当前月份最后一天

    1 template中如下代码
  • (java)宠物商店,接口实现

    基本思想 使用一个接口作为宠物商店的标准 只要满足接口内的方法都可以实现接口进入宠物商店 本例子用yellVoice 方法作为标准 整体代码 import java util Scanner 导入Sacnner类 interface Pet
  • 画出有3个节点的树和有3个结点的二叉树的所有不同的形态

    画的难看了点
  • 【HDLBits 刷题 11】Circuits(7)Finite State Manchines 18-26

    目录 写在前面 Finite State Manchines Fsm serialdata Fsm serialdp Fsm hdlc Design a Mealy FSM ece241 2014 q5a ece241 2014 q5b 2
  • Data->Iopb->Parameters.Create.Options & FILE_DIRECTORY_FILE 判断是否为路径

    如何在minifilter 判断操作的文件对象是目录还是文件呢 有很多人发现答案是 Data gt Iopb gt Parameters Create Options FILE DIRECTORY FILE 是否成立 不过也有很多人发现 上
  • centos7 nginx 配置 ssl证书

    安装nginx 从阿里云服务器下载 nginx版本的ssl证书 防止再 etc nginx ssl 下 停止 nginx 服务 systemctl stop nginx 修改配置文件 etc nginx conf d root izm5ej
  • app离线消息推送服务器,在线消息推送和离线消息推送(3)

    首先介绍一下具体的功能设计 整个系统由服务端 客户端组成 客户端包含前端 浏览器端 pyqt桌面端 和后台 用于添加要推送的消息 因为浏览器端不容易注意到实时提醒 所以我将实时提醒功能放到pyqt桌面端中实现 如托盘区闪烁等醒目的方式 浏览
  • Unity 数据保存失败

    问题 游戏数据突然保存不了了 没有任何报错 切后台保存也出问题 编辑器上和PC端没问题 移动端上保存不了 原因 我使用的存储方式是 Newtonsoft Json 将对象转换成加密字符串并保存到本地 而不巧的是 我使用了 HashSet 这
  • BOOST升压电路原理详解

    原文来自公众号 工程师看海 BOOST升压电源是利用开关管开通和关断的时间比率 维持稳定输出的一种开关电源 它以小型 轻量和高效率的特点被广泛应用在各行业电子设备找那个 是不可缺少的一种电源架构 公众号后台回复 boost仿真文件 Boos
  • Linux 添加开机启动方法

    添加开启启动的方式一般有如下几种 第一种 把开机命令 写入到os的启动文件之中 伴随着启动文件的读取 顺便帮你把要启动的任务 一起启动了 第二种 把启动任务 放到os的启动目录下 os启动过程之中 会执行所有放在此目录下的任务 第三种 os
  • KaTeX数学公式输入

    序号 运算符 输入 举例 举例代码 1 x y
  • 【Java 学习】方法 和 一些编程案例

    文章目录 一 概述 二 案例 1 计算1 n的和返回 2 判断整数是奇数还是偶数 3 数组求最值改方法实现 三 方法的内存原理 四 方法参数传递机制 基本类型 引用类型 五 参数传递的案例 1 打印整型数组内容 2 从数组中查询指定元素的索
  • 【机器学习】SMO算法

    1 SMO基础概念 将原始最优化问题转化成了其对偶问题 因为对偶问题是一个凸二次规划问题 这样的凸二次规划问题具有全局最优解 其中 xi yi xi yi 表示训练样本数据 xixi为样本特征 yi 1 1 yi 1 1 为样本标签 C为惩
  • 中国货币超发严重 去年新增货币占全球近一半

    提要 2009年以来 中国已成为目前全球最大的 印钞机 2012年 全球新增货币供应量中国占近一半 21世纪网评估发现 均衡人均收入差异后 中国的经济货币化程度高居全球前列 截至2012年末 中国M2余额达到人民币97 42万亿元 居世界第
  • JS考点

    JavaScript 1 原始值和引用值类型及区别 原始值即存在栈中的数据 包含symbol number string null undefined boolean类型 引用值即存在堆中的对象 对象地址 指针 存在栈中 指向堆中存储的数据
  • 2021-07-25

    神经网络 M P神经元 感知机 感知机 神经网络 M P神经元 1 M P神经元 模拟生物行为的数学模型 接手n个输入 来自其他的神经元 并给各个输入赋予权重计算加权和 再跟自己特有的阀值 比较 通常用减法 最后经过激活函数 模拟 抑制 和
  • Stable Diffusion Base Model from safetensors transfer to diffusers

    Steps File Setup Clone the ControlNet model repo from HF into a folder like hf controlnet model git clone https huggingf
  • Qt 中父子关系使用总结

    背景 Qt 中到父子关系和类的继承无关 仅表示对象间到从属关系 继承自 QObject 的对象在构造时需要指定父对象指针 include