2、初始化构造函数参数,parent和QObject *parent = nullptr

1

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
}
  • QMainWindow 是 MainWindow 的父类

  • QWidget *parent 中的 parent 值赋值给 QMainWindow(parent) 中的 parent,这其实是用到C++的语法,执行MainWindow的构造函数前先执行父类QMainWindow的构造函数

  • 写这句 QMainWindow(parent) 的原因是 new 一个 MainWindow 对象可以指定父对象,从而使用 Qt 提供的内存自动回收机制

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

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

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

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

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

2

关于QWidget *parent=0的理解

Widget 是使用Qt编写的图形用户界面(GUI)应用程序的基本生成块。每个GUI组件,如按钮、标签或文本编辑器,都是一个Widget,并可以放置在现有的用户界面中或作为单独的窗口显示。每种类型的组件都是由QWidget 的特殊子类提供的,而QWidget又是QObject的子类。QWidget是所有Qt GUI界面类的基类,它接收鼠标、键盘及其他窗口事件,并在显示器上绘制自己。

通过传入QWidget 构造函数的参数(或者调用QWidget:setWindowFlags()和 QWidget::setParent()函数)可以指定一个窗口部件的窗口标识( window flags)和父窗口部件。

窗口标识( window flags):

窗口标识定义了,该部件的窗口类型和窗口提示(hint);
窗口类型指定了窗口部件的窗口系统属性( window-system properties); 仅一个。
窗口提示定义了顶层窗口的外观,-一个窗口可以有多个提示(提示能够进行按位或操作)。

窗口

窗口通常具有一个窗口边框( frame)和一个标题栏。
根据有无边框和标题栏,可分为,子窗口部件和窗口!
QMainWindow和所有的QDialog对话框子类都是经常使用的窗口类型,而子窗口部件通常处在父窗口部件的内部,没有窗口边框和标题栏,没有父窗口部件的Widget对象就是一个窗口。

QWidget窗口部件的构造函数为: QWidget (QWidget *parent=0, Qt: :WindowFlags f=0),其中,参数parent指定了窗口部件的父窗口部件;

1、如果parent=0 ( 默认值),则新建的窗口部件一定将是一个窗口;

2、如果parent != 0,则新建的窗口部件可能是子窗口部件也有可能是一个窗口,由它参Qt::WindowFlags属性决定;

假设是窗口部件的话,它就只会出现在父窗口部件的界面内部。参数f指定了新窗口部件的窗口标识,默认值是0,即Qt::Widget。

————————————————
版权声明:本文为CSDN博主「闫有尽意无琼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yanchenyu365/article/details/111313773

posted @   zznic  阅读(914)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示