最近有小伙伴問(wèn)到:在Qt開發(fā)中,當(dāng)使用QtCreator自帶的工程向?qū)?chuàng)建了一個(gè)類后,如下代碼所示:
問(wèn)題來(lái)了:上圖紅色矩形框圈出的兩個(gè)地方描述的是同一個(gè)類嗎?
首先這個(gè)問(wèn)題剛接觸Qt的時(shí)候可能會(huì)有此一問(wèn),在此處記錄一下。這里需要知道上述代碼是QtCreator自動(dòng)生成的(如果使用向?qū)?chuàng)建一個(gè)類)。
用同樣的方法新創(chuàng)建一個(gè)類,(用鼠標(biāo)點(diǎn)擊工程項(xiàng)目后,右鍵單擊,選擇“添加新文件”,在彈出的對(duì)話框中,選擇Qt->Qt設(shè)計(jì)師界面類->Widget)將會(huì)彈出“選擇類名”對(duì)話框:
在上圖中,默認(rèn)情況下其頭文件、源文件和Form文件都是同一個(gè)命名,點(diǎn)擊下一步后則創(chuàng)建一個(gè)名為Form
的類,該類位于form.h/.cpp
中。在from.h頭文件中,該類定義如下:
可以看到,Form
類和MainWindow
類在生成方式上是一樣的。
好啦,如果我們?cè)谛聞?chuàng)建類的時(shí)候?yàn)槠渲匦旅?img src="https://file1.elecfans.com//web2/M00/9E/A2/wKgZomToHN2AQznDAAEQ7fGTfcg547.png" alt="ca6b643e-8bf2-11ed-bfe3-dac502259ad0.png" />其自動(dòng)生成的代碼還是那種方式的寫法:
至此,得出一個(gè)結(jié)論:
這是QtCreator的固定寫法,當(dāng)我們新創(chuàng)建類的時(shí)候,QtCreator這個(gè)IDE會(huì)自動(dòng)生成。
言歸正傳,回到本文的問(wèn)題,下圖中紅色圈出的地方,雖然在名稱上是一樣的,但是他倆不是同一個(gè)東西。由于使用了QtCreator的類創(chuàng)建向?qū)?chuàng)建類,所以他們?cè)诿Q上是一樣的:
上述問(wèn)題還引出了另一個(gè)問(wèn)題:Qt中界面與邏輯的分離,在這一點(diǎn)上應(yīng)該很好的體現(xiàn)這一思想。接著往下看:
QT_BEGIN_NAMESPACE
namespaceUi{classMainWindow;}
QT_END_NAMESPACE
本質(zhì)上,上述代碼是UI界面類的聲明:QT_BEGIN_NAMESPACE
和QT_END_NAMESPACE
兩個(gè)宏定義是Qt對(duì)命名空間的一個(gè)包裝,上述語(yǔ)句中,class MainWindow;
則是指界面類。當(dāng)我們的工程在編譯構(gòu)建后,會(huì)生成一個(gè)類似于ui_xxx.h的文件,界面類則放置在這個(gè)文件中,本文則是ui_mainwindow.h
,該文件會(huì)在對(duì)應(yīng)的源文件中包含:
注:ui_xxx.h是由QtCreator根據(jù)界面中的組成元素自動(dòng)生成的,可在對(duì)應(yīng)的xxx.ui文件中查看該類中包含了哪些界面組成元素。
由于此處mainwindow.ui文件中沒有放置多余的界面元素,故生成的文件比較簡(jiǎn)單,這里是ui_mainwindow.h文件,自動(dòng)生成代碼如下:
#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;}
則是對(duì)ui_mainwindow.h文件中定義的MainWindow的聲明。回到mainwindow.h文件中,在MainWindow類中有一個(gè)私有數(shù)據(jù)成員:ui
指針,該指針指向了Ui::MainWindow
,且在mainwindow.cpp文件中實(shí)例了Ui::MainWindow
類,而且還通過(guò)ui指針調(diào)用了setupUi()
函數(shù)初始化了界面。在Qt中,正是通過(guò)這種方式將界面與邏輯進(jìn)行了關(guān)聯(lián)。
一個(gè)軟件界面由很多界面元素組成,在實(shí)際工程開發(fā)中,通過(guò)QtCreator可以在xxx.ui文件中使用鼠標(biāo)快速進(jìn)行布局和創(chuàng)建界面組成元素。在對(duì)應(yīng)的xxx.h/.cpp文件中使用
ui
指針則可以引用xxx.ui文件中生成的界面元素。『這正是Qt框架的特性!』
審核編輯 :李倩
-
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69043 -
Qt
+關(guān)注
關(guān)注
1文章
308瀏覽量
38065 -
矩形
+關(guān)注
關(guān)注
0文章
15瀏覽量
12625
原文標(biāo)題:學(xué)Qt,此問(wèn)題必解!
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論