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

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

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

扩展命名空间:

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

例如:

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

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

进入正题:

ui_xxxx.h文件

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

其中还有两个宏QT_BEGIN_NAMESPACE与QT_END_NAMESPACE

  1. QT_BEGIN_NAMESPACE
  • 这是一个Qt框架中的宏,它标志着命名空间的开始。它实际上被定义为 {
  • 使用这个宏的目的是为了确保Qt库中的所有声明都在正确的命名空间中。这是为了避免全局命名冲突,因为Qt可能涉及大量的符号和名称。
  1. namespace Ui { class MainWindow; }
  • QT_BEGIN_NAMESPACEQT_END_NAMESPACE之间,定义了一个名为Ui的命名空间,并在其中声明了一个名为MainWindow的类。这是一个前向声明,通常在头文件中,以避免包含整个类的定义,从而提高编译速度。
  1. QT_END_NAMESPACE
  • 这是另一个Qt宏,它标志着命名空间的结束。它实际上被定义为 }
  • QT_BEGIN_NAMESPACE一样,这个宏确保在正确的位置结束命名空间。

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

MainWindow.h文件

MainWindow.cpp文件

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

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

所以代码如下:

同理根据:#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文件中

目录
相关文章
|
6月前
|
Web App开发 存储 Linux
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
445 0
|
6月前
【QT】读写.ini配置文件的程序实现
【QT】读写.ini配置文件的程序实现
109 0
|
6月前
|
算法 数据可视化 程序员
【Qt UI】调色板QPalette类在Qt编程中的应用
【Qt UI】调色板QPalette类在Qt编程中的应用
191 0
|
6月前
|
算法 API C++
【Qt UI】QT 窗口/控件置顶方法详解
【Qt UI】QT 窗口/控件置顶方法详解
479 0
|
6月前
|
算法 前端开发 C++
【Qt UI相关】Qt设置窗体或控件的背景色透明
【Qt UI相关】Qt设置窗体或控件的背景色透明
695 0
|
6月前
|
存储 测试技术 UED
Qt中实现界面回放的艺术:从理论到代码“ (“The Art of Implementing UI Playback in Qt: From Theory to Code
Qt中实现界面回放的艺术:从理论到代码“ (“The Art of Implementing UI Playback in Qt: From Theory to Code
155 1
|
4月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
460 3
|
2月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
3月前
qt 手搓ui
qt 手搓ui
43 3