最近有小伙伴問到:在Qt開發中,當使用QtCreator自帶的工程向導創建了一個類后,如下代碼所示:
問題來了:上圖紅色矩形框圈出的兩個地方描述的是同一個類嗎?
首先這個問題剛接觸Qt的時候可能會有此一問,在此處記錄一下。這里需要知道上述代碼是QtCreator自動生成的(如果使用向導創建一個類)。
用同樣的方法新創建一個類,(用鼠標點擊工程項目后,右鍵單擊,選擇“添加新文件”,在彈出的對話框中,選擇Qt->Qt設計師界面類->Widget)將會彈出“選擇類名”對話框:
在上圖中,默認情況下其頭文件、源文件和Form文件都是同一個命名,點擊下一步后則創建一個名為Form
的類,該類位于form.h/.cpp
中。在from.h頭文件中,該類定義如下:
可以看到,Form
類和MainWindow
類在生成方式上是一樣的。
好啦,如果我們在新創建類的時候為其重新命名:其自動生成的代碼還是那種方式的寫法:
至此,得出一個結論:
這是QtCreator的固定寫法,當我們新創建類的時候,QtCreator這個IDE會自動生成。
言歸正傳,回到本文的問題,下圖中紅色圈出的地方,雖然在名稱上是一樣的,但是他倆不是同一個東西。由于使用了QtCreator的類創建向導創建類,所以他們在名稱上是一樣的:
上述問題還引出了另一個問題:Qt中界面與邏輯的分離,在這一點上應該很好的體現這一思想。接著往下看:
QT_BEGIN_NAMESPACE
namespaceUi{classMainWindow;}
QT_END_NAMESPACE
本質上,上述代碼是UI界面類的聲明:QT_BEGIN_NAMESPACE
和QT_END_NAMESPACE
兩個宏定義是Qt對命名空間的一個包裝,上述語句中,class MainWindow;
則是指界面類。當我們的工程在編譯構建后,會生成一個類似于ui_xxx.h的文件,界面類則放置在這個文件中,本文則是ui_mainwindow.h
,該文件會在對應的源文件中包含:
注:ui_xxx.h是由QtCreator根據界面中的組成元素自動生成的,可在對應的xxx.ui文件中查看該類中包含了哪些界面組成元素。
由于此處mainwindow.ui文件中沒有放置多余的界面元素,故生成的文件比較簡單,這里是ui_mainwindow.h文件,自動生成代碼如下:
#ifndefUI_MAINWINDOW_H
#defineUI_MAINWINDOW_H
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
classUi_MainWindow
{
public:
QWidget*centralwidget;
QMenuBar*menubar;
QStatusBar*statusbar;
voidsetupUi(QMainWindow*MainWindow)
{
if(MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(800,600);
centralwidget=newQWidget(MainWindow);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
MainWindow->setCentralWidget(centralwidget);
menubar=newQMenuBar(MainWindow);
menubar->setObjectName(QString::fromUtf8("menubar"));
MainWindow->setMenuBar(menubar);
statusbar=newQStatusBar(MainWindow);
statusbar->setObjectName(QString::fromUtf8("statusbar"));
MainWindow->setStatusBar(statusbar);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
}//setupUi
voidretranslateUi(QMainWindow*MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow","MainWindow",nullptr));
}//retranslateUi
};
namespaceUi{
classMainWindow:publicUi_MainWindow{};
}//namespaceUi
QT_END_NAMESPACE
#endif//UI_MAINWINDOW_H
從上述代碼可見,在mainwindow.h文件中的:
namespaceUi{classMainWindow;}
則是對ui_mainwindow.h文件中定義的MainWindow的聲明。回到mainwindow.h文件中,在MainWindow類中有一個私有數據成員:ui
指針,該指針指向了Ui::MainWindow
,且在mainwindow.cpp文件中實例了Ui::MainWindow
類,而且還通過ui指針調用了setupUi()
函數初始化了界面。在Qt中,正是通過這種方式將界面與邏輯進行了關聯。
一個軟件界面由很多界面元素組成,在實際工程開發中,通過QtCreator可以在xxx.ui文件中使用鼠標快速進行布局和創建界面組成元素。在對應的xxx.h/.cpp文件中使用
ui
指針則可以引用xxx.ui文件中生成的界面元素。『這正是Qt框架的特性!』
審核編輯 :李倩
-
代碼
+關注
關注
30文章
4779瀏覽量
68525 -
Qt
+關注
關注
1文章
302瀏覽量
37899 -
矩形
+關注
關注
0文章
15瀏覽量
12598
原文標題:學Qt,此問題必解!
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論