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 一个 MainWindow 对象可以指定父对象,从而使用 Qt 提供的内存自动回收机制

4、QWidget  *parent 中为 QWidget 的原因是 QWidget 为窗口类型的类的基类,对于其他父类(比如非QMainWindow,即非窗口类),parent类型是 QObject

5、ui(new Ui::MainWindow)的作用相当于 ui = new Ui::MainWindow,即对对象 ui 进行实例化

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

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

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

时间: 2024-10-12 19:31:24

Qt ------ 初始化构造函数参数,parent的相关文章

关于QT构造函数参数parent的解释

比如说我在头文件里定义了一个类 class PaintWidget:public QWidget { public: PaintWidget(QWidget*parent=0) } 然后在cpp中写 PaintWidget::PaintWidget(QWidget*parent):QWidget(parent) 意思是说,重定义父对象. 如何重定义呢?看parent参数. 当PaintWidget放到某个窗口上的时候,该PaintWidget的父对象可以被重定义为该窗口. PaintWidget

C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?

之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导致栈溢出. 下面来看一个例子: class test { public: test() { cout << "constructor with argument\n"; } ~test() { } test(test& t) { cout << "

有关初始化构造函数何时由编译器生成的讨论?

代码部分 #include "iostream" using namespace std; //讨论初始化构造函数 //主要讨论在有虚函数情况下的初始化构造函数问题 //含有虚函数的类对象维护一个vptr指向类中的vtbl class ZoolAnimal { public: ZoolAnimal(){} ~ZoolAnimal(){} virtual void animates(){ cout << "ZoolAnimal::animates()" &

单件模式+打开窗体+窗体构造函数参数

利用单件模式避免重复打开窗体,窗体为无参数构造函数模式. 注:该博客中有自动关闭窗体的方法 http://www.cnblogs.com/zfanlong1314/p/3567308.html 为了打开窗体时传入参数,可以改变方法的传递参数,本人修改后代码如下 /// <summary> /// 泛型实现窗体实例单件化/// </summary> /// <typeparam name="T">窗体类</typeparam> public

Spring4-自动装配Beans-通过构造函数参数的数据类型按属性自动装配Bean

1.创建Maven项目,项目名称springdemo17,如图所示 2.配置Maven,修改项目中的pom.xml文件,修改内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// <param name="propertyFunc"></param> /// <param name="propertyValue"></param> public DemoClass (Expression<Func&

C++之构造函数参数列表

参考自:https://blog.csdn.net/sunSHINEEzy/article/details/78122485 构造函数之默认构造函数(调用的构造函数不用传递参数) 两种实例化方式都是默认构造函数 构造函数之初始化列表 红字部分即为初始化列表:一个引号,多个参数用逗号隔开,赋值用() 初始化列表特性: 其先于构造函数执行 其只能用于构造函数 其可以同时初始化多个数据成员 [注意]初始化列表的功用:对于类中的静态常量,不能用构造函数来初始化,必须使用初始化列表的方式 拷贝构造函数 拷

程序的转化 &amp; 明确的初始化操作 &amp; 参数的初始化 &amp; 返回值的初始化

一丶程序的转化考察以下代码: 1 X Foo() 2 { 3 X xx; 4 //... 5 return xx; 6 } 看到这个, 你可能会有两个想法:1. 每次 Foo() 被调用, 就会传回 xx 的值.2. 如果 class X 定义了一个 copy constructor, 那么当 Foo() 被调用时, 保证该 copy constructor 也会被调用. 这两个假设的真实性实际都要以 class X 如何定义而定, 在一个高品质的 C++ 编译器中, 以上两个假设都是错误的.

qt 程序启动参数 -qws

运行嵌入式程序 在嵌入式QT版本中,程序需要服务器或自己作为服务器程序.服务器程序构造的方法是构造一个QApplication::GuiServe类型的QApplication对象.或者使用-qws命令选项启动程序. Using a Single Display使用-qws选项接下来的程序可以当做客户端来运行,只要不使用-qws选项.那么客户端程序就会自动连接到服务程序中. using Mutiple Displays嵌入式版本中运行多个县市同时运行.两种方式可以实现,要么多次运行服务程序,要么