自动生成的主窗体程序中(MainWindow),会有以下几个文件:
细心的人会发现在头文件中,有一个命名空间声明
namespace Ui {
class MainWindow;
}
它和自定义的主窗体类同名,主窗体类如下:
class MainWindow : public QMainWindow
{
...
private:
Ui::MainWindow *ui;//此处的MainWindow已经指明了是上面Ui中定义的类。这里只是同名。
}
但是他们两个是全部不同的东西,但是有点特殊的联系。鼠标右键转入第一个MainWindow的类实现函数中,如下所示:
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
这段代码在#include "ui_mainwindow.h"头文件中。Ui_MainWindow类的定义也在此文件中,它有个成员函数setupUi会被继承给MainWindow。setupUi函数就是初始化的关键所在。它有个参数,在函数内会对传入的参数进行处理。如下所示,它对传入的窗体类进行大小、工具栏,菜单栏的初始化设置。
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(400, 300);
menuBar = new QMenuBar(MainWindow);
menuBar->setObjectName(QStringLiteral("menuBar"));
MainWindow->setMenuBar(menuBar);
mainToolBar = new QToolBar(MainWindow);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
...
回到我们自定义的类class MainWindow : public QMainWindow。系统给它自动生成的构造函数中,先新建了一个UI的MainWindow并通过setupUi对传入的主窗体对象进行初始化。如下所示:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)//新建一个,初始化该成员对象
{
ui->setupUi(this);//在setupUi函数中,对传入的自定义主窗体类进行初始化
}
最后在析构函数中对新建的UI的MainWindow类型对象ui释放内存。
MainWindow::~MainWindow()
{
delete ui;
}