0


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

见代码的注释

#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>namespace Ui {classMainWindow_gui;// 将原来的MainWindow改为了MainWindow_gui。 此处在“Ui”的命名空间中,声明了一个MainWindow_gui类。}classMainWindow:publicQMainWindow// MainWindow 是基于QMainWindow 派生的类{
    Q_OBJECT

public:explicitMainWindow(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生成后放在编译目录中了。编译时会连接。
见代码的注释

#ifndefUI_MAINWINDOW_H#defineUI_MAINWINDOW_H#include<QtCore/QVariant>// ***省略***classUi_MainWindow// 定义了一个 Ui_MainWindow 类{public:// ***省略***voidsetupUi(QMainWindow *MainWindow){// ***省略***}// setupUi};namespace Ui {// Ui空间里,定义了一个MainWindow_gui类,该类继承自Ui_MainWindow classMainWindow_gui:publicUi_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;}
标签: ui qt 开发语言

本文转载自: https://blog.csdn.net/chshch83/article/details/122927568
版权归原作者 永不止步啊 所有, 如有侵权,请联系我们删除。

“ui(new Ui::MainWindow) 解惑”的评论:

还没有评论