ui(new Ui::MainWindow) 解惑


一、问题描述

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;
}
  • 15
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值