QT中namespace
QT新建的widget application專案中,專案檢視可見的標頭檔案和cpp檔案有三個:
mainwindow.h
main.cpp
mainwindow.cpp
另外還有一個隱藏的:
ui_mainwindow.h
其中引用關係是:
main.cpp 引用 mainwindow.h
mainwindow.cpp 引用 mainwindow.h 和 ui_mainwindow.h
mainwindow.h
- 定義名稱空間QT_NAMESPACE 和內層巢狀的名稱空間Ui
namespace QT_NAMESPACE {
namespace Ui { class MainWindow; }
}
- 使用內層名稱空間Ui
QT_NAMESPACE這個名稱空間可以保證裡面的東西在本.h檔案都可以被找到,下面用到的 Ui 就是剛剛定義的內層名稱空間 Ui,不用寫外層
Ui::MainWindow *ui
ui_mainwindow.h
- 定義名稱空間Ui
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
mainwindow.cpp
- 使用名稱空間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類。
- ui_mainwindow.h中的Ui裡的MainWindow類
繼承Ui_MainWindow, 而這個Ui_MainWindow裡
包含各個控制元件物件以及相關的set函式等
- 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裡的)