分享

ui(new Ui::MainWindow) 解惑-CSDN博客

 青山代码yyf 2025-03-31 发布于广西

一、问题描述

QT生成一个简单的MainWindow工程后,mainwindows.cpp中,实现了MainWindow的构造函数,见如下代码。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

冒号后面的两行代码,是C++的列表初始化。其中QMainWindow(parent) 是显式调用基类的构造函数, ui(new Ui::MainWindow) 是初始化ui指针。ui指针在mainwindow.h中定义的。

当初看到ui(new Ui::MainWindow) ,我的问题来了,MainWindow的构造函数,会 new 一个MainWindow,不是又会调用一下MainWindow的构造函数吗?这岂不是套娃?会死循环的。但实际运行正常,肯定是自己的理解错了。

结论:
QT将两个不同的类都命名成了MainWindow,通过namespace进行了区分。
Ui命名空间的变量名,和默认空间的变量名,虽然一样,但实际是两个东西。

二、问题分析

1.mainwindow.h

见代码的注释

#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

3.mainwindow.cpp

这个文件,没有在工程目录下,应该是qt生成后放在编译目录中了。编译时会连接。
见代码的注释

// 手动测试了一下,两个头文件没有先后include的关系
#include "mainwindow.h" 
#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;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多