正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话

2023-11-18

 

该如何理解下面段代码的第二行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调用有整型参数的构造函数。

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

看到了吗,我们发现:

  • 创建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所指窗口的子窗口,那么当父窗口被删除时,子窗口也会自动的被删除。

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

正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话 的相关文章

  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 如何使QTableView类的restoreState()和saveState()正常工作?

    首先 我想说 我的问题已经在这里讨论过 并且这里是 https stackoverflow com questions 1163030 qt qtableview and horizontalheader restorestate 但答案并
  • 无法在带有 QSortFilterProxyModel 的 QTreeView 的点击信号中使用 itemFromIndex

    我有一个 QTreeView 在视图和 QStandardItemModel 之间有一个 QSortFilterProxyModel 来对树进行排序 然后我想通过 clicked 信号对视图中的点击进行操作 模型 视图的设置类似于 mymo
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub

随机推荐

  • Win10 WSL2-CentOS7开启systemctl命令(2022-11-18更新)

    Win10 WSL2 CentOS7开启systemctl命令 2022 11 18更新 概述 文章基于如下环境 已开启WSL2的win10或者win11 WSL2下的CentOS7 下载地址为 CentOS7 自从win10支持WSL2以
  • lanelet安装

    1 https github com KIT MRT mrt cmake modules 2 sudo apt get install libpugixml dev sudo apt get install libpugixml1v5 3
  • 群体遗传学---admixture软件快速群体分群

    群体遗传学中测的很多个个体 得到了最终的SNP vcf文件 需要将其分成群体 看那几个物种聚在一起 一般使用的软件就是STRUCTURE 但是STREUTURE运行速度极慢 后面frappe软件提升了速度 但是也不是很快 admixture
  • php 解析 %e5%80%aa%e9%a3%9e,content.json

    title Linux安装Docker date 2020 11 08T14 54 29 000Z path 2020 11 08 Linux安装Docker tags name Linux Docker slug Linux Docker
  • loC和AOP使用扩展

    6 1多种方式实现依赖注入 6 1 1构造注入 6 1 2技能训练1 6 1 3使用p命名空间实现属性注入 Spring配置文件从2 0版本开始采用schema形式 使用不同的命名空间管理不同类型的配置使得配置文件更具扩展性 列如 我们曾使
  • [Python]pip查找包的历史版本

    pip查找包的历史版本 场景 在一些时候通过pip install xxx 安装第三方库的时候默认情况下安装最新版本 由于是最新版本有个稳定性就不得不考虑其中 所以部分场景会存在一些bug这就要求我们安装历史版本 对一些更新频率比较高的三方
  • Window&linux使用换行符的问题总结

    1 Window使用Git时 设置换行符格式 参见 https www jianshu com p 6ef90ce18ba2 2 vi下设置回车换行符等特殊符号 换行方式 在早期的打印机时代 开始新的一行要占用两个字符的时间 如果到了一行的
  • java.lang.UnsatisfiedLinkError

    java lang UnsatisfiedLinkError 原因 jni注册的时候匹配写错了 I B B 如下 static JNINativeMethod methods native getSps I B B void Native
  • Keras保存模型并载入模型继续训练

    我们以MNIST手写数字识别为例 import numpy as np from keras datasets import mnist from keras utils import np utils from keras models
  • PyQt5中的按钮3-QCommandLinkButton

    PyQt5中的按钮3 QCommandLinkButton QCommandLinkButton介绍 QCommandLinkButton举例 QCommandLinkButton介绍 CommandLinkButton 外观像是一个被设置
  • verilog赋多位值_关于verilog 赋值

    1 wire表示直通 即只要输入有变化 输出马上无条件地反映 reg表示一定要有触发 输出才会反映输入 2 只有 lt 表示非阻塞 给沿触发的寄存器赋值 是阻塞赋值 给电平触发的信号赋值 3 不指定就默认为1位wire类型 专门指定出wir
  • 计算机视觉论文-2021-07-19

    本专栏是计算机视觉方向论文收集积累 时间 2021年7月19日 来源 paper digest 欢迎关注原创公众号 计算机视觉联盟 回复 西瓜书手推笔记 可获取我的机器学习纯手推笔记 直达笔记地址 机器学习手推笔记 GitHub地址 1 T
  • 在struts1.1框架下,利用smartupload实现文件的上传(可以是多个文件)

    1 前端页面upload jsp 后台处理程序UplodAction java 2 struts config的配置参数如下 没有设置 ActionForm
  • JAVA的WebService规范(支持)

    SOA Service Oriented Architecture 面向服务架构是一种思想 它将应用程序的不同功能单元通过中立的契约 独立于硬件平台 操作系统和编程语言 联系起来 使得各种形式的功能单元更好的集成 目前来说 WebServi
  • windows7旗舰版 appium环境搭建

    1 安装jdk 8u171 windows x64 exe 注意配置环境变量 参考资料 https jingyan baidu com article 6dad5075d1dc40a123e36ea3 html java version 查
  • Modbus RTU协议各知识点入门 + 实例

    文章目录 1 起因 2 几个重点 2 1 一些难懂的概念 2 2 CRC的高低位 2 3 其他 3 介绍 3 1 起源 3 2 分类 4 格式 4 1 串口协议 4 2 帧格式 5 数据类型 6 功能码 7 CRC16 modbus 8 实
  • React(Hook介绍)

    为什么要用Hook 介绍Hooks之前 首先要给大家说一下React的组件创建方式 一种是类组件 一种是纯函数组件 并且React团队希望 组件不要变成复杂的容器 最好只是数据流的管道 开发者根据需要 组合管道即可 也就是说组件的最佳写法应
  • 如何在 CentOS 8 上安装 Python 3.8

    本文来自于 阿里云官方镜像站 https developer aliyun com mirror utm content g 1000307095 原文链接 https developer aliyun com article 756221
  • 报错java.lang.Long cannot be cast to java.lang.Integer解析

    用博客记录工作中出现的问题 给自己一个提醒 也给其他朋友一些借鉴 报错 java lang Long cannot be cast to java lang Integer Long 无法转化成Integer类型 这个异常 经常出现在hin
  • 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话

    该如何理解下面段代码的第二行QWidget parent 1 Widget Widget QWidget parent 2 QWidget parent 3 4 在讲解原因之前 先请大家看下面的一个例子 include