对话框是GUI程序和用户进行简短交互的顶层窗口,所谓顶层窗口即始终在主窗口之上显示。QDialog是Qt所有类型的对话框窗口的基类,它继承于QWidget,是一种容器类型组件。

  QWidget是所有窗口类的抽象,它也可以生成对话框,但是对话框是常见的窗口组件,若每次要使用对话框,都利用QWidget来生成并设置相关参数,显然十分繁琐。所以Qt为我们封装了另外一个子类QDialog,专门用于生成对话框

QDialog类是对话框窗口的基类。对话框窗口是主要用于短时期任务以及用户进行简要通讯的顶级窗口。QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。他们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下方,使用setSizeGripEnable()。

注意:QDialog使用父窗口部件的方法和Qt中其他类不同。对话框总是顶级窗口部件,但是如果它有一个父对象,它的默认位置就是父对象的中间。他也将和父对象共享工具条条目。

QDialog 是最普通的顶级窗口(一个不会被嵌入到父窗口部件的窗口部件叫顶级窗口部件)。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可以没有这个修饰)在Qt中。QMainWindow和不同的QDialog的子类是最普通的顶级窗口。

非顶级窗口部件就是子窗口部件。他们是他们的父窗口部件中的子窗口。你通常不能在视觉角度从它们的父窗口部件辨别一个子窗口部件。在Qt中的绝大多数其他窗口部件仅仅作为子窗口部件才是有用的。(当然把一个按钮作为或者叫做顶级窗口部件也是有可能的,但是绝大多数人喜欢把它们的按钮放到其他部件当中)

如果是顶级对话框,那就是基于QDialog创建,如果是主窗体,就基于QMainWindow,如果不确定,或有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。

该如何理解下面段代码的第二行QWidget(parent)

1 Widget::Widget(QWidget *parent) :2 QWidget(parent)3 {4 }

在讲解原因之前,先请大家看下面的一个例子

#include <iostream>using namespace std;class Base{public:Base() :m_num(0){cout << "this is Base()" << endl;}Base(int val):m_num(val){cout << "this is Base(int val)" << endl;}private:int m_num;};

1 上方代码定义了一个基类Base,并且有两个构造函数,一个是默认构造函数,一个是有一个整型参数的构造函数。

class BaseChild: public Base{public:BaseChild(){cout << "this is BaseChild()" << endl;}BaseChild(int val): Base(val){cout << "this is BaseChild(val)" << endl;}private:int m_num;};

2 上方代码定义了一个BaseChild类,并继承Base类,同样的,它也定义了两个构造函数,一个默认,一个有整型参数。

int main(int argc, char *argv[]){BaseChild child1;BaseChild child2(5);return 0;}

3 main函数实例化了两个子类实例,child1,child2。child1调用默认构造函数。child2调用有整型参数的构造函数。

现在,我们运行程序,会有如下打印:

this is Base()!

this is Base(int Val)!

this is BaseChild()!

this is BaseChild(int Val)!

看到了吗,我们发现:

  • 创建child1时,是先调用了Base的默认构造函数,再调用自己的默认构造函数
  • 创建child2时,是先调用了Base(int)这个构造函数,再调用自己的整型参数构造函数。

所以我们回头看BaseChild的构造函数

BaseChild(int val): Base(val){cout << "this is BaseChild(val)" << endl;}

细心的同学,可能早就发现了,初始化列表中的Base(val)正是调用了我们Base基类的有参构造函数,而这样的写法就刚好是我们开头代码中的那段

Widget::Widget(QWidget *parent) :QWidget(parent)

所以Widget是调用了QWidget下面的构造函数

QWidget(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());

所以得出如下总结:

总结: · 如果不指定构造函数,则派生类会调用基类的默认构造函数 · 派生类构造函数的初始化列表只能初始化派生类成员,不能直接初始化继承成员,如果想 要调用基类的有参构造函数,则可以在派生类的初始化列表中显示指定

以上总结,也告诉我们,当定义一个类时,最好为该类定义默认构造函数。

至此,我们明白了这个写法为什么会这样写。

好的,那么我们又提出一个问题,“调用QWidget(parent)这个构造函数,QWidget父类都做了哪些动作呢?”

下面是QWidget源码中的一部分节选:

QWidget::QWidget( QWidget *parent, const char *name, WFlags f ): QObject( parent, name ), QPaintDevice( PDT_WIDGET ),pal( parent ? parent->palette() // use parent's palette: *qApp->palette() ) // use application palette{if ( parent ) {QChildEvent *e = new QChildEvent( Event_ChildInserted, this );QApplication::postEvent( parent, e );}}

大家从上面可以看出,如果parent参数非空的话,那么该构造函数使用了其父窗口的调色板,并且发送了QChildEvent事件,这会让新的窗口成为parent所指窗口的子窗口,那么当父窗口被删除时,子窗口也会自动的被删除。

初始化列表中的Base(Vale)正好调用了Base基类的有参构造函数。

同理,可以理解Widget::Widget(QWidget *parent) :QWidget(parent)。Widget::Widget(QWidget *parent) :QWidget(parent)调用了QWidget基类的下述构造函数:

QWidget(QWidget*parent =Q_NULLPTR,Qt::WindowFlagsf =Qt::WindowFlags());

     如果不指定构造函数,则派生类会调用基类的默认构造函数 。派生类构造函数的初始化列表只能初始化派生类成员,不能直接初始化继承成员,如果想 要调用基类的有参构造函数,则可以在派生类的初始化列表中显示指定。

    当定义一个类时,最好为该类定义一个默认构造函数。

对应语法:

        派生类::派生类构造函数(总参数列表):基类构造函数(参数列表)  //基类构造函数的参数列表是实参。
{
派生类中的数据成员初始化;

}

QT 烦人的parent该如何理解相关推荐

  1. 【杂谈】如何应对烦人的开源库版本依赖-做一个心平气和的程序员?

    平时做开发时最烦人的除了项目不会做,恐怕就是环境依赖的问题了吧. 一个好好的项目,换个环境总是出问题,开源库一升级就挂掉,总有"坏人"搞掉自己的系统库,今天就来随便聊聊吧. 作者 ...

  2. throw 烦人_烦人的简单句子聚类

    throw 烦人 Making the machine understand the modalities of any language is the core of almost all the ...

  3. java scala_经过几天的Scala回归Java的10个最烦人的事情

    java scala 因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适. 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此 ...

  4. 经过几天的Scala回归Java的10个最烦人的事情

    因此,我正在尝试使用Scala,因为我想编写一个解析器,而Scala Parsers API似乎非常合适. 毕竟,我可以在Scala中实现解析器并将其包装在Java接口后面,因此除了附加的运行时依赖关 ...

  5. 如何彻底解决烦人的 MySQL 分库分表问题?写一个更好的数据库!

    作者 | 黄东旭 责编 | 郭   芮 我还清楚记得,五年前的这个时候,当时还在豌豆荚,午后与刘奇和崔秋的闲聊关于未来数据库的想象,就像一粒种子一样,到了今天看起来也竟枝繁叶茂郁郁葱葱,有点感慨.按照 ...

  6. 【R语言系列01】烦人的拼贴操作 详述 paste and paste0

    R语言系列01 烦人的拼贴操作 paste 与 paste0 相信很多人在一开始使用R语言的paste, paste0的时候,总是拿捏不准,感到有些迷糊. 本期文章中,我将记录对比一些操作以及表现,加 ...

  7. java--新猿来瞅瞅==那些烦人的符号

     Java 是一种广泛应用于多个行业的编程语言,具有广泛的应用范围.作为一名 Java 新手,了解代码中不同符号的含义可能会令人望而生畏. 任何一项知识的学习都不可能一蹴而就,因此也不要一时的挫折而全 ...

  8. 安卓网页广告拦截_拦截烦人的网页广告,增加上网体验

    本号所有资源版权归原作者所有,如有侵权请加小编微信删除.本号免费分享,仅供学习交流,下载后24小时内请自觉删除,切勿用于商业用途,否则后果自负! 今天重新整理分享几大主流浏览器和IE浏览器拦截广告的方 ...

  9. Jmeter之解决烦人的中文乱码问题

    Jmeter之解决烦人的中文乱码问题 参考文章: (1)Jmeter之解决烦人的中文乱码问题 (2)https://www.cnblogs.com/liulinghua90/p/6973289.htm ...

最新文章

  1. SecureCRT上传下载文件
  2. 算法导论之字符串匹配
  3. Qt 互斥锁 QMutex 的简单应用
  4. python requests请求失败重试_Python Requests.post()请求失败时的retry设置
  5. spring boot 入门荔枝
  6. 公里与英里的换算c语言函数_60迈=60码=60公里?这三者天壤之别,可别搞错了
  7. BZOJ - 2186 欧拉函数
  8. 反转!继SDA之后 WiFi联盟、蓝牙技术联盟、JEDEC协会恢复华为会员资格
  9. 【题解】(排序) —— POJ 0811:牛的选举
  10. 计算机专业男生宿舍,实拍大学男生宿舍,男生们不是玩电脑游戏,就是瘫在床上看手机!...
  11. hb100 微波雷达arduino_HB100微波雷达模块无线X波段雷达探测器探头传感器模块10.525GHz...
  12. webstrom 常用的快捷键
  13. 高淇Java300集
  14. 单张像片空间后方交会
  15. Mac_IOS_报:The Xcode build system has crashed. Please close and reopen your workspace.
  16. 【Godot】一个节点发射器(泼水机)
  17. 紫外可见分光光度计 | 探索光的工具 | 详解
  18. winform 两个区域保持固定距离_【麻辣烫】川渝区域零担十强分析:余氏东风、力展、宇鑫、金泓达快运、长吉、西部风、海风快运、绍平、迪丰、健隆......
  19. connect ETIMEDOUT......
  20. 词袋 图像检索 matlab,词袋模型BoW图像检索Python实战

热门文章

  1. iOS面试题整理---关键字!!!
  2. wpf 绑定数据无法更新ui控件可能存在的问题
  3. 具体解释可变參数列表
  4. 人生应该记住的16句话(转载)
  5. [Quiz]竞赛题目 Word Trace
  6. map函数的简单用法。
  7. java 自定义注解 解析_java自定义注解
  8. 极限学习机的matlab程序_新程序员七宗罪,新手别踩雷
  9. java 二叉树中和为某一值的路径_25. 二叉树中和为某一值的路径
  10. rabbitmq 查询版本_基于rabbitmq解决分布式事务