【QT】如何理解Widget::Widget(QWidget *parent) :QWidget(parent)

‪qwidget.cpp所在路径:D:\Qt\Qt5.9.9\5.9.9\Src\qtbase\src\widgets\kernel\qwidget.cpp

本文重点:如何理解下面这段代码?


一、类的继承和派生

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent)
{
}

Widget::~Widget()
{
}

首先,我们可以从QT的页面看出:Widget是自定义的派生类,QWidget是基类。

在这里插入图片描述

我们再来看QT的基类QWidget的定义。注意QWidget的构造函数是public属性,且是有2个参数的默认构造函数。注意,这里的构造函数 QWidget() ,被public关键字修饰,才能够在类外被调用。

在这里插入图片描述

派生类构造函数的一般形式为:

派生类构造函数名(总参数表):基类构造函数名(参数表)
{
派生类中新增加数据成员初始化语句
}

派生类的构造函数,Widget()在类内声明,类外定义,且是public属性:

// 类内声明,类外实现
Widget(QWidget *parent = nullptr);	// parent是形参变量

Widget::Widget(QWidget *parent) : QWidget(parent)  // 冒号“:”后面部分是在调用基类的构造函数,parent是实参。
{
    //对派生类新增的数据成员进行初始化
}

其中 parent 只是函数的形参,而不是QWidget基类的成员属性(Properties)。我们从构造函数的类外定义可以看出,Widget()构造函数的形参变量 parent 会成为实参被传入QWidget()构造函数中。注意,QWidget(parent) 不是定义基类的构造函数,而是调用基类的构造函数。


额外补充:

QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
    : QObject(*new QWidgetPrivate, 0), QPaintDevice()
{
    QT_TRY {
        d_func()->init(parent, f);
    } QT_CATCH(...) {
        QWidgetExceptionCleaner::cleanup(this, d_func());
        QT_RETHROW;
    }
}

这里 parent 的作用是设置父窗口,构造函数中默认为0,即没有父窗口,是顶级窗口。如果指定parent值,则当前窗体将会是父窗口的一个子部件。


在构造派生类对象时,需要对基类的成员变量和新增成员变量初始化。基类的构造函数并没有继承下来,派生类对于很多基类成员对象是不能够直接访问的,因此需要调用基类的构造函数,才能完成对基类成员变量的初始化工作。




二、QWidget的介绍

QWidget是用户操作的原子接口,它从窗口系统中接收鼠标,键盘以及其他事件,并绘制图形界面。QT提供的默认窗口基类只有QMainWindow、QWidget、和QDialog这三种,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而它们全部继承自QWidget。不仅如此,所有的窗口部件都继承自QWidget,继承关系如图所示。

img


一个没有父窗口部件的窗口部件一直是顶级窗口部件。非顶级窗口部件是父窗口的子部件。QWidget构造函数有两个参数:QWidget *parent = 0,Qt::WindowFlags f = 0。parent即父窗口,默认为0,即没有父窗口,是顶级窗口,如果指定parent值则当前窗体将会是一个子部件。Qt::WindowFlags是Qt::WindowType枚举值的组合,用来设置窗口的属性,f = 0表默认为Qt::Widget风格。

Widget(QWidget* parent = nullptr, Qt::WindowFlags f = 0);

自定义窗口类Widget,该类继承自QWidget基类。parent即父窗口,默认为0,即没有父窗口,是顶级窗口。如果指定parent值则当前窗体将会是一个子部件,并且被parent的几何形状所强迫

Qt::WindowFlags f = 0 (在可用的地方)设置窗口标志;默认值适用于几乎所有窗口组件,但如果要获得一个没有窗口系统框架的窗口,则必须使用特殊的标志。


QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有一个字体属性,但是它自己从来不用。有很多继承它的子类提供了实际的功能,比如QPushButton、QListBox和QTabDialog等等。




参考连接:

QT部件基类——QWidget与QDialog

【QT】——QWidget窗口类
正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值