ui(new Ui::MainWindow) 解惑-程序员宅基地

技术标签: QT  qt  ui  开发语言  


一、问题描述

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;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chshch83/article/details/122927568

智能推荐

pycharm ssh连接远程服务器报错:can’t get remote credentials for deployment server_can't get remote credentials for ssh configuration-程序员宅基地

文章浏览阅读8.9k次,点赞7次,收藏4次。将下图中visible only for this preject 前 选中状态 的勾去掉即可。_can't get remote credentials for ssh configuration presentableid

Java内存溢出——OutOfMemoryError体验——JProfiler安装_jprofiler heapdumponoutofmemoryerror-程序员宅基地

文章浏览阅读566次。在实际的开发过程中,我们经常遇到java.lang.OutOfMemoryError异常,那么如何定位是程序的哪里出现这个异常的呢?本博文将体验OutOfMemoryError的定位本博文体验的软件环境JDK版本IDEJava 1.8.0.144_x64IDEA 2019.1编写OutOfMemoryError的代码 public class Tes..._jprofiler heapdumponoutofmemoryerror

【云原生】Docker-compose单机容器集群编排_dockercompose是容器集群系统吗-程序员宅基地

文章浏览阅读1.3k次,点赞3次,收藏2次。1.Compose的相关知识 1. Compose的相关概念 2. 为何需要docker-composedocker镜像管理的问题 Docker Compose的解决方案3. Compose的特征 2. Docker-compose的安装 3. Compose配置常用字段和YAML 文件编写3.1 YAML 文件格式及编写注意事项 (1)YAML 序列 (2)YAML 映射 (3)序列的映射 (4)映射的映射 (5)序列的序列 (6)映射的序列 3.2 Docker Compose配置常用字段3.3 _dockercompose是容器集群系统吗

android 蓝牙编程重点---如何发送和接收16进制数据_e4a 文本框显示16进制-程序员宅基地

文章浏览阅读5.1k次。与蓝牙模块通信最重要的地方就是数据的发送和接收,因为是底层的操作,所以更多是发送16进制数据。进制转换是我们程序员的必修课,属于基本素质。这里需要的是将字节数组转化为16进制字符串,方法都是通用的:[java] view plain copy public static String bytesToHexString(byte[] b_e4a 文本框显示16进制

NNI使用体验_mac安装nni-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏7次。NNI使用体验NNI安装过程体会NNI在GitHub上的中文页面NNI使用过程体会NNI上手较为容易。有一定机器学习调参经验的同学都能很快掌握它的使用方法。即使是第一次接触这类工具的萌新也能根据官网上详细的教程在几天内基本学会。个人觉得它最大的特点在于友善度极高的Web UI界面。下面我们以官方给出的mnist例子为例简单说明。(nni/examples/trials/mnist)调用..._mac安装nni

Jmeter 用户思考时间,定时器,和代理服务器_jmeter中测试活动think time-程序员宅基地

文章浏览阅读7.6k次。[摘要:正在背载测试中须要斟酌的的一个紧张要素是思索时光(think time), 也便是正在两次乐成的拜访要求之间的停息时光。 有多种景象挥收致使耽误的产生: 用户须要时光浏览笔墨内容,或]  在负载测试中需要考虑的的一个重要要素是思考时间(think time), 也就是在两次成功的访问请求之间的暂停时间。 有多种情形挥发导致延迟的发生: 用户需要时间阅读文字内容,或者填表,或者查_jmeter中测试活动think time

随便推点

A Drop-in Debug Memory Manager_xcode memorymanager::initializefallback()-程序员宅基地

文章浏览阅读100次。简单易懂的 C++ 内存管理器 _xcode memorymanager::initializefallback()

Unix/Linux文件类型-程序员宅基地

文章浏览阅读338次,点赞8次,收藏9次。Unix/Linux对数据文件(.mp3、.bmp),程序文件(.c、.h、*.o),设备文件(LCD、触摸屏、鼠标),网络文件( socket ) 等的管理都抽象为文件,使用统一的方式方法管理。每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器对应/dev/fd0。它是用于向I/O设备提供连接的一种文件,分为字符设备和块设备文件。通常,Unix/Linux系统中常用的文件类型有7种:普通文件、目录文件、设备文件、管道文件、链接文件和套接字。

Dataset Condensation with Distribution Matching论文笔记-程序员宅基地

文章浏览阅读469次。提出了一种简单而有效的方法,通过匹配合成图像和原始训练图像在许多采样嵌入空间中的特征分布来合成浓缩图像。我们的方法大大降低了合成成本,同时实现了相当的或更好的性能_dataset condensation with distribution matching

盘点最常用的几款linux服务器管理面板_linux面板-程序员宅基地

文章浏览阅读8.1k次。事先抱歉一下,本文比较长,系亲身经验总结所得,写的比较细~当然了,不足或者片面之处,欢迎评论指出。按照搜索热门和推荐程度对比的管理工具软件有:安全狗,云帮手,宝塔。对比内容:新手上手难度对比,操作便捷性,站点管理,云主机检测,云主机修复,使用过程中不足和优势。一.安全狗(安全狗官网地址)1.新手上手容易度:★★★★✰(4/5颗星)1.1安装分两部分,云主机和个人pc网页个人pc网页:..._linux面板

Linux中的sed命令,使用方法之一「替换字符串中的内容 」,以及「s/ / / 」和「s/ / /g」之间的区别_linux sed -i替换-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏8次。■前言按照如下写法,可以实现替换字符串的功能■具体操作sed 's/hello/hi/' 321.html替换对象 hello替换后,显示的内容 hi只是在输出的时候,被替换,不会改变原有的文件的内--■应用:虽然,只是临时改变(不会改变原有文件中的内容),但是,在shell脚本中,是我们可以把改变后的值,作为变量保存起来,在后续处理中使用■更多操作https://blog.csdn.net/qq_37931597/article/..._linux sed -i替换

ActiveReports 报表应用教程 (13)---嵌入第三方控件_activereports 第三方数据源-程序员宅基地

文章浏览阅读304次。ActiveReports 控件与Visual Studio完美集成,给我们带来更为灵活易用的报表定制和自定义控件嵌入支持,除了可以在报表中使用 ActiveReports 内置控件外,您还可以在报表中添加任意的第三方 .NET 控件,从而满足您更多的报表扩张能力的需求。本文展示的是在 ActiveReports 区域报表中使用 C1Gauge for Windows Forms 和 C1C_activereports 第三方数据源