Qt构造函数的参数:QObject *parent = Q_NULLPTR

几乎所有的Qt类的构造函数都会有一个parent参数。这个参数通常是QObject* 或者是 QWidget* 类型的。很多情况下它都会有一个初始值0,因此,即便你不去给它复制也没有丝毫的问题。于是,稍微偷懒一下,就会不自觉的忽略了这个参数。那么,这个参数到底是干什么用的呢?

其实,这个参数有很多用处。就像它的名字一样,这个参数指定了组件的父组件。对于一个对话框来说,对话框一般是不作为顶层容器出现的,因此在任务栏上一般是没有对话框的位置的。怎么指定这个对话框不是顶层容器呢?有父组件的组件不就不是顶层容器了吗?因此,只要你指定对话框的parent属性,任务栏就不会出现它的身影。当然,如果你不指定,这个对话框就成为顶层容器了,任务栏会给它留个位置的——利用这个特性,就可以实现特殊对话框可以在任务栏出现的效果,比如“关于”对话框的出现。

另外比较通用,也是很重要的作用是,parent参数指明了组件的父组件,这样,当父组件delete时,Qt可以保证所有子组件——也就是parent指针指向这个组件的所有组件——都会被正确的delete掉。这是Qt能够帮助我们管理一部分内存的原因所在。Qt是通过遍历parent属性来防止了这一部分内存泄漏的。因此,必要情况下还是不要忘记设置这个parent属性。当然,如果你不声明这个属性,当整个程序关闭时,操作系统会回收内存——因此我们所说的内存泄漏一般是指我们自己写的应用程序的内部,而不会影响到整个操作系统——当然,如果你实现太可恶,操作系统也会受不了自动关掉你的程序的:-)

时间: 2025-01-12 19:56:54

Qt构造函数的参数:QObject *parent = Q_NULLPTR的相关文章

Qt ------ 初始化构造函数参数,parent

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } 1.QMainWindow 是 MainWindow 的父类 2.QWidget *parent 中的 parent 值赋值给 QMainWindow(parent) 中的 parent 3.写这句 QMainWindow(parent) 的原因是 new 一个 MainWindo

利用T4模板生成ASP.NET Core控制器的构造函数和参数

前言 在ASP.NET Core中引入了DI,并且通过构造函数注入参数,控制器中会大量使用DI注入各种的配置参数,如果配置注入的参数比较多,而且各个控制器需要的配置参数都基本一样的话,那么不断重复的复制黏贴代码提供相应的构造函数,效率低效也,因此使用T4模板生成控制器的构造函数 ,这也得益于C#对分部类(partial)的支持. T4模板生成控制器构造函数 图中CtrlTemplate.tt为模板文件,CtrlNames.txt为需要使用T4生成代码的控制器名称文件,CtrlTemplate.c

拷贝构造函数的参数为什么必须是引用?

拷贝构造函数的参数为什么必须是const引用? 先看如下代码: class CExample { private: int a; public: //构造函数 CExample(int b) { a = b;} //拷贝构造函数 CExample(const CExample& C) { a = C.a; } }; int main() { CExample A(100); CExample B(A); return 0; } 1 首先讨论为什么必须要是引用? 如果这里改成 : CExample

关于给构造函数传达参数方法

<?php //给构造函数传达参数 header("Content-type: text/html; charset=utf-8"); class test { private $user_ids=array("66645","66586"); private $user_id; //构造传递参数 public function __construct($user_id) { $this->user_id=$user_id; if(!

拷贝构造函数的参数为什么必须使用引用类型(避免无限递归拷贝,但其实编译器已经强制要求了)

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答.不好还好,我有理性这个好品质.思索一下以后,发现这个答案是不对的.让我来撕开(有点暴力,但是我喜欢,嘿嘿--龇牙)那件隐藏在真理外的小裤衩,让它袒露在“登徒子”们的眼前吧. 先从一个小例子开始:(自己测试一下自己看看这个程序的输出是

原来... 拷贝构造函数的参数为什么必须使用引用类型

原来... 拷贝构造函数的参数为什么必须使用引用类型 转自:http://blog.csdn.net/tunsanty/article/details/4264738 在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答.不好还好,我有理性这个好品质.思索一下以后,发现这个答案是不对的

用反射获取构造函数带参数的实例对象

经过测试,如果显示声明有参构造函数,用反射实例化的时候,就需要传入构造函数的参数,如果同时声明了有参和无参构造函数 或只声明了无参构造函数则不需要传入参数,直接可以获取实例 //显示无参构造函数,如果只显示定义了有参构造函数,就不能使用如下代码反射创建实例对象            //var art = Assembly.LoadFrom(@"F:\Q\NET\qi\jlcms_sql_src\jlcms.Web\bin\jlcms.DAL.dll").CreateInstance(

构造函数的参数和默认选项合并

构造函数的参数和默认选项合并,在用原生JS写组件时会用到. function extend(){ var obj={}, arg=argments, len=arg.length; for(var i=0;i<len;i++){ for(var key in arg[i]){ obj[key]=arg[i][key]; } }; return obj; }

[C++参考]拷贝构造函数的参数必须是引用类型

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识.在effective C++中说过这么一点:拷贝构造函数的参数必须是引用类型的.但是为什么呢? 拷贝构造函数的参数必须是引用类型的 如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数.因此拷贝构造函数的参数必须是