ui(new Ui::MainWindow) 解惑

时间:2025-01-14 07:08:49

文章目录

  • 一、问题描述
  • 二、问题分析
    • 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;
}