1. 程式人生 > 其它 >QT中namespace

QT中namespace

技術標籤:c++qt

QT新建的widget application專案中,專案檢視可見的標頭檔案和cpp檔案有三個:
mainwindow.h
main.cpp
mainwindow.cpp

另外還有一個隱藏的:
ui_mainwindow.h

其中引用關係是:
main.cpp 引用 mainwindow.h
mainwindow.cpp 引用 mainwindow.hui_mainwindow.h

mainwindow.h

  1. 定義名稱空間QT_NAMESPACE 和內層巢狀的名稱空間Ui
namespace QT_NAMESPACE {
namespace Ui { class MainWindow;
} }
  1. 使用內層名稱空間Ui

QT_NAMESPACE這個名稱空間可以保證裡面的東西在本.h檔案都可以被找到,下面用到的 Ui 就是剛剛定義的內層名稱空間 Ui不用寫外層

Ui::MainWindow *ui

ui_mainwindow.h

  1. 定義名稱空間Ui
namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

mainwindow.cpp

  1. 使用名稱空間Ui
ui(new Ui::MainWindow);

注意這裡使用的 Ui是ui_mainwindow.h裡面的,因為mainwindow.h裡的Ui是內層巢狀,外層是QT_NAMESPACE只在那個檔案裡有效

如何判斷對不對?萬能ctrl大法,點進去看看跳到哪個檔案。結果顯示確實跳到ui_mainwindow.h這個檔案

區別?

兩個Ui名稱空間有什麼區別,為什麼QT要創造兩個名字一樣的名稱空間. 好像是個神奇的演算法耶,放個感覺很大佬的連結:
https://blog.csdn.net/hebbely/article/details/79267348?utm_source=app

兩個名稱空間 Ui 中各自宣告一個MainWindow類。

  1. ui_mainwindow.h中的Ui裡的MainWindow類

繼承Ui_MainWindow, 而這個Ui_MainWindow裡
包含各個控制元件物件以及相關的set函式等

  1. mainwindow.h中的Ui裡的MainWindow類

繼承QMainWindow,
包含另外那位MainWindow類的指標ui,和槽函式

mainwindow.cpp用的是第一個,main.cpp用的是第二個
第二個包含第一個的指標以及自己的槽函式
有種第二個包含第一個的意思

再看一下這段來自mainwindow.cpp開頭的
出現了3次MainWindow !!!

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow);
    
//第一個:同名標頭檔案中的MainWindow類作用域
//第二個:類中的建構函式
//第三個:異名標頭檔案中的MainWindow類
(就是ui_mainwindow.h裡的)