一 模板文件解析
记得几年前刚学习QT的模板文件的语法特征让新手的我头晕目眩,差点放弃。下面我将细致的介绍这几行代码的用途及语法
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
逐行解析如下:
1.1 第一句 使用构造函数
1.1.1 “::”符号
Widget::Widget(QWidget *parent)
1 - 第一个 Widget 是类名,它表示这个函数是 Widget 类的一个成员函数。
2 - 第二个 Widget 是这个成员函数的名称,它是一个构造函数,用于初始化 Widget 类的实例
3 - :: 是 C++ 中的作用域解析运算符(Scope Resolution Operator)。在这里,它用于指定 Widget 构造函数属于 Widget 类的作用域。通常,在类定义之外实现类的成员函数时,需要使用作用域解析运算符来指定该函数属于哪个类
Widget 类的定义在 widget.h 头文件中,而构造函数的实现在 widget.cpp 源文件中,那么在 widget.cpp 中实现构造函数时,就需要使用 Widget::Widget(QWidget *parent) 这样的语法来指定这是 Widget 类的构造函数。
也就是说: 这句代码是使用 类::构造函数(参数)的方式执行构造函数
解析:正常情况下,构造函数确实是在对象实例化时自动执行的。当你创建一个类的实例时,比如使用 Widget w; 或者 Widget *pw = new Widget();,构造函数会被自动调用以初始化对象。然而,C++也允许在类的声明之外定义类的成员函数,包括构造函数。
注意:“实现了这个构造函数”中的“实现”并不是指执行,而是指编写或定义了构造函数的具体代码
1.1.2 “:”符号
Widget::Widget(QWidget *parent) : QWidget(parent)这句代码中,:是C++中的成员初始化列表的语法。它用于在构造函数体中任何代码执行之前,初始化类的成员变量和基类。
- Widget::Widget(QWidget *parent)是Widget类的构造函数的声明和定义。它表明这是一个构造函数,用于创建Widget类的实例,并且它接受一个指向QWidget的指针作为参数。
- : QWidget(parent)是成员初始化列表的一部分,它用于初始化Widget类的基类QWidget。这里,它将parent参数传递给QWidget的构造函数,以便QWidget基类可以正确地初始化。
成员初始化列表的语法是在构造函数参数列表之后,使用:开始,然后是一系列用逗号分隔的初始化器。每个初始化器都指定了一个成员变量或基类,并提供了用于初始化它的值或表达式。
注意:在Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)这段代码中,QWidget(parent)和ui(new Ui::Widget)都被称为初始化器。 初始化器用于在构造函数体执行之前初始化基类和成员变量。
- QWidget(parent)是一个基类初始化器,它调用基类QWidget的构造函数,并将parent参数传递给它。
- ui(new Ui::Widget)是一个成员变量初始化器,它动态分配一个Ui::Widget对象,并将其地址赋给成员变量ui。
- 初始化器列表中的初始化器之间用逗号分隔,并且它们的执行顺序与在列表中出现的顺序相同。这意味着在这个例子中,首先会初始化基类QWidget,然后会初始化成员变量ui。
1.1.3 ui->setupUi(this)
ui->setupUi(this); 这行代码在 Qt 的 widget 类中非常常见,它用于设置用户界面的初始状态。下面我将解析这行代码的语法和用途。
语法解析
- ui 是一个指向 Ui::Widget 类的实例的指针。这个类通常是由 Qt 的用户界面编译器(uic)从 .ui 文件中自动生成的,它包含了用户界面的所有控件(如按钮、文本框等)的定义。
- -> 是 C++ 中的成员访问运算符,用于通过指针访问类的成员。 setupUi 是 Ui::Widget 类中的一个成员函数,它负责根据 .ui 文件中的定义来初始化用户界面。
- (this) 是对 setupUi 函数的调用,其中 this 指针指向当前的 Widget 对象实例。
用途
ui->setupUi(this); 这行代码的用途是在 Widget 类的构造函数中调用,以初始化用户界面。具体来说,它会:
- 创建 .ui 文件中定义的所有控件的实例。
- 设置这些控件的初始属性,如大小、位置、文本等。
- 将这些控件添加到窗口的布局中。
这样,当 Widget 类的实例被创建时,它的用户界面就会根据 .ui 文件的定义被自动设置好,无需编写额外的代码来手动创建和布局控件。这大大简化了 Qt 应用程序的用户界面开发过程。
注意:Widget 对象实例 = this, 注意Widget对象实例与ui的区别
Widget对象实例是用户定义的类的实例,它代表了一个具体的窗口或窗口部件;而ui则是一个指向由.ui文件生成的类的实例的指针,它包含了该窗口或窗口部件的所有界面元素。