文章目录
- 一、问题描述
- 二、问题分析
- 2.ui_mainwindow.h
一、问题描述
QT生成一个简单的MainWindow工程后,中,实现了MainWindow的构造函数,见如下代码。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
冒号后面的两行代码,是C++的列表初始化。其中QMainWindow(parent) 是显式调用基类的构造函数, ui(new Ui::MainWindow) 是初始化ui指针。ui指针在中定义的。
当初看到ui(new Ui::MainWindow) ,我的问题来了,MainWindow的构造函数,会 new 一个MainWindow,不是又会调用一下MainWindow的构造函数吗?这岂不是套娃?会死循环的。但实际运行正常,肯定是自己的理解错了。
结论:
QT将两个不同的类都命名成了MainWindow,通过namespace进行了区分。
Ui命名空间的变量名,和默认空间的变量名,虽然一样,但实际是两个东西。
二、问题分析
见代码的注释
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow_gui; // 将原来的MainWindow改为了MainWindow_gui。 此处在“Ui”的命名空间中,声明了一个MainWindow_gui类。
}
class MainWindow : public QMainWindow // MainWindow 是基于QMainWindow 派生的类
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
// 定义了一个指向MainWindow_gui的指针pui。MainWindow_gui是在Ui命名空间中的,所以要写成“ Ui::MainWindow_gui”
Ui::MainWindow_gui * pui;
};
#endif // MAINWINDOW_H
2.ui_mainwindow.h
这个文件,没有在工程目录下,应该是qt生成后放在编译目录中了。编译时会连接。
见代码的注释
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
// ***省略***
class Ui_MainWindow // 定义了一个 Ui_MainWindow 类
{
public:
// ***省略***
void setupUi(QMainWindow *MainWindow)
{
// ***省略***
} // setupUi
};
namespace Ui {
// Ui空间里,定义了一个MainWindow_gui类,该类继承自Ui_MainWindow
class MainWindow_gui: public Ui_MainWindow {};
} // namespace Ui
#endif // UI_MAINWINDOW_H
这个文件,没有在工程目录下,应该是qt生成后放在编译目录中了。编译时会连接。
见代码的注释
// 手动测试了一下,两个头文件没有先后include的关系
#include ""
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : // 具体实现了MainWindow的构造函数
QMainWindow(parent), // 调用基类QMainWindow的构造函数,因为MainWindow是从QMainWindow派生来的
pui(new Ui::MainWindow_gui) // new一个Ui空间里的MainWindow_gui类,并将其指针初始化pui
{
pui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete pui;
}