QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系

这篇具有很好参考价值的文章主要介绍了QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先需要回顾一下cpp命名空间知识;

扩展命名空间:

一个文件中书写了两个相同名字的命名空间,第二个命名将作为第一个命名空间的补充

例如:

QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系,c++,qt

第一个Ui命名空间是一个前置声明;第二个Ui是具体定义,就跟函数声明和函数名义一模一样

以上代码等价于一下代码:

QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系,c++,qt

进入正题:

ui_xxxx.h文件

QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系,c++,qt

有一个命名空间Ui,其中定义了一个类MainWindow继承字Ui_MainWindow,这样就具有UI_MainWindow所有特征了。

其中还有两个宏QT_BEGIN_NAMESPACE与QT_END_NAMESPACE

  1. QT_BEGIN_NAMESPACE

    • 这是一个Qt框架中的宏,它标志着命名空间的开始。它实际上被定义为 {
    • 使用这个宏的目的是为了确保Qt库中的所有声明都在正确的命名空间中。这是为了避免全局命名冲突,因为Qt可能涉及大量的符号和名称。
  2. namespace Ui { class MainWindow; }

    • QT_BEGIN_NAMESPACEQT_END_NAMESPACE之间,定义了一个名为Ui的命名空间,并在其中声明了一个名为MainWindow的类。这是一个前向声明,通常在头文件中,以避免包含整个类的定义,从而提高编译速度。
  3. QT_END_NAMESPACE

    • 这是另一个Qt宏,它标志着命名空间的结束。它实际上被定义为 }
    • QT_BEGIN_NAMESPACE一样,这个宏确保在正确的位置结束命名空间。

总体来说,这段代码的目的是定义了一个名为Ui的命名空间,其中包含了一个名为MainWindow的类的前向声明。这通常是在Qt的UI文件中使用的,以便在C++代码中使用UI设计工具创建的窗口类而不需要包含整个UI文件的定义。这有助于减少编译时间和降低代码耦合。(chatgpt的解释)

MainWindow.h文件

QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系,c++,qt

MainWindow.cpp文件

QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系,c++,qt

我们来一步一步合并代码:

首先#include "mainwindow.h"会将mainwindow.h文件内容直接复制到cpp文件

所以代码如下:

QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系,c++,qt

同理根据:#include "ui_mainwindow.h"

代码过长不给图片了

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

//第一个命名空间
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QListView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QListView *listView;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName("MainWindow");
        MainWindow->resize(800, 600);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName("centralwidget");
        listView = new QListView(centralwidget);
        listView->setObjectName("listView");
        listView->setGeometry(QRect(130, 80, 256, 192));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName("menubar");
        menubar->setGeometry(QRect(0, 0, 800, 21));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName("statusbar");
        MainWindow->setStatusBar(statusbar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
    } // retranslateUi

};

//扩展命名空间
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

再次合并两个相同的命名字的命名空间(并删除无用的代码)

合并后

#include <QMainWindow>
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QListView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QListView *listView;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName("MainWindow");
        MainWindow->resize(800, 600);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName("centralwidget");
        listView = new QListView(centralwidget);
        listView->setObjectName("listView");
        listView->setGeometry(QRect(130, 80, 256, 192));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName("menubar");
        menubar->setGeometry(QRect(0, 0, 800, 21));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName("statusbar");
        MainWindow->setStatusBar(statusbar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } 

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
    } 

};

//合并后的样子
namespace Ui
{
    class MainWindow;
    class MainWindow: public Ui_MainWindow {};
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

这样子就能看懂了吧,在MainWindow.h里面声明的UI命名空间是一个前置声明,防止因为找不到Ui而在编译的时候报错,因为#inlcude "ui_xxx.h"并不在MainWindow.h里面是在MainWindow.cpp文件中,而编译的时候只会在本文件内中查询是否存在该命名空间,所以需要一个前置声明,当然你也可以直接把写在MainWindow.cpp的#include "ui_xxx.h"复制到MainWindow.h文件中,但是QtCreator默认就是把#include "ui_xxx.h"放在MainWindow.cpp文件中文章来源地址https://www.toymoban.com/news/detail-800046.html

到了这里,关于QT第一个程序命名空间详解,解释ui_widget的和xxx.cpp的联系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「PHP系列」PHP 命名空间详解

    PHP 的命名空间(Namespace)是 PHP 5.3.0 版本之后引入的一个功能,用于解决类名冲突的问题,并更好地组织代码。通过使用命名空间,你可以将相关的类、接口、函数和常量组合在一起,形成一个逻辑上的代码单元,从而避免不同库或框架中的类名冲突。 你可以使用 namespace 关

    2024年04月12日
    浏览(38)
  • 详解C++中的命名空间(namespace)

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 在C++中,总共有63个,大家还记得在C语言中有多少个吗,没错,在C语言中总共有32个。 下面是C++的: asm do if auto return try contin

    2023年04月19日
    浏览(34)
  • 命名空间“Microsoft”中不存在类型或命名空间名“office”(是否缺少程序集引用?)

    生成软件的时候提示office报错 项目-引用-右击添加引用-选择如下图-点击确定 选择后点击重新生成即可生成成功! 如果是之前就有添加,然后再打开这个软件显示office报错,就将之前引用的删除,重新添加引用 。

    2024年02月11日
    浏览(46)
  • k8s学习笔记(四):命名空间(namespace)详解

    Kubernetes中的Namespace是一种用于在 集群内部组织和隔离资源 的机制。一个Namespace可以看作是一个 虚拟的集群 ,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。 Namespace 适合用于 隔离不同用户创建的资源 用于给集群中的 任何对

    2024年02月12日
    浏览(35)
  • Unity 未能找到程序集或命名空间

    程序集定义 Assembly Definition 程序集相当于一个文件夹。如果没有程序集,脚本就会被默认打包到Assembly-CSharp.dll中,这样编译的时候就比较浪费时间,一旦有修改,就要整体重新编译。将项目内的脚本文件放置到多个程序集中,这样当某个文件改动的时候,只会重新编译对应的

    2024年02月12日
    浏览(36)
  • 刘铁猛C#语言入门详解课程听课笔记--初识类与命名空间

    类:构成程序的主体;C语言是一门面向过程的程序设计语言,所以其用函数来组织程序;C#语言是一门完全面向对象的程序设计语言,其用类来组织程序,类是构成程序的主体,任何一个方法和变量都必须隶属于某一个具体的类;而C++也是一门面向对象的程序设计语言,但是

    2024年02月13日
    浏览(35)
  • 500行代码手写docker-以新命名空间运行程序

    本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到github,地址如下: 本章要完成的任务则是g

    2024年02月05日
    浏览(42)
  • 【C++初阶】关键字&命名空间&缺省函数&函数重载入门必看!!!超详解!!!

     ========================================================================= 主页点击直达: 个人主页 我的小仓库:代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 计算机

    2024年02月07日
    浏览(45)
  • C# 图解教程 第5版 —— 第22章 命名空间和程序集

    ​ 在许多项目中,会使用其他程序集的类或类型,而不仅仅是自己声明的。这些程序集(称为类库)可能来自 BCL 或第三方供应商,也可以是自己创建的。通常这些程序集文件的名称以 .dll 扩展名结尾,而不是 .exe。 图22.1 SuperLib 源代码和结果程序集 ​ 假设还要写一个名为

    2024年01月18日
    浏览(38)
  • 【C++】命名空间 namespace 与 标准流 iostream ( 命名空间概念简介 | 命名空间定义 | 命名空间使用 | iostream 中的命名空间分析 )

    命名空间 namespace 又称为 名字空间 , 名称空间 , 名域 , 作用域 , 是 C++ 语言 对 C 语言 的扩展 之一 ; C++ 中的 命名空间 namespace 指的是 标识符 的 可见范围 , C++ 标准库中的 所有 标识符 , 都定义在 std 命名空间中 ; 命名空间 英文名称是 \\\" namespace \\\" , name 是 名字 , 名称 的意思 ,

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包