一、導(dǎo)讀
本質(zhì)上,Qt Designer的ui文件是一個(gè)以XML格式書寫的文件,文件中內(nèi)容描述了一個(gè)界面的widget關(guān)系樹。這個(gè)文件在以下兩種情況下會(huì)使用到:
- (1)在編譯的時(shí)候,這意味著ui文件將被轉(zhuǎn)換為可編譯的c++代碼,這個(gè)過程由
uic
完成。 - (2)在應(yīng)用程序運(yùn)行的時(shí)候,ui文件將由
QUiLoader
類處理,該類用于解析XML文件并動(dòng)態(tài)構(gòu)造widget樹。
本文描述第一種情況:在編譯的時(shí)候使用ui文件。描述ui文件背后的機(jī)制,以及如何在應(yīng)用程序中使用設(shè)計(jì)好的ui文件。
二、編譯過程中對(duì)ui文件的處理
? 在實(shí)際項(xiàng)目開發(fā)中,使用Qt Designer創(chuàng)建用戶界面組件(當(dāng)然也完全可以使用代碼描述),并使用Qt的集成構(gòu)建工具qmake
和uic
在構(gòu)建應(yīng)用程序時(shí)為生成代碼,這個(gè)過程是集成開發(fā)環(huán)境完成的。生成的代碼包含了ui文件中描述的用戶界面對(duì)象,它是一個(gè)c++結(jié)構(gòu)體,包含以下幾個(gè)內(nèi)容:
- (1)指向窗體小部件、布局、布局項(xiàng)、按鈕組和操作的指針。
- (2)名為
setupUi()
的成員函數(shù),用于在父部件上構(gòu)建部件樹。 - (3)名為
retranslateUi()
的成員函數(shù),用于處理ui文件字符串屬性的轉(zhuǎn)換。
生成的代碼可以在應(yīng)用程序中包含,并可以直接使用。除此之外,還可以用于擴(kuò)展標(biāo)準(zhǔn)小部件的子類。
了解了QtCreator對(duì)ui文件背后的處理機(jī)制,下文將來看看如何在編譯構(gòu)建過程中使用ui文件。
三、在編譯過程中如何使用ui文件
主要有三種方法在編譯過程中使用ui文件:1、直接附加、2、單繼承方式、3、多繼承方式。
1、直接附加:構(gòu)造一個(gè)小部件作為組件的占位符,并在其中設(shè)置用戶界面。
2、單繼承方式:子類化Qt標(biāo)準(zhǔn)界面元素的基類(例如QWidget或QDialog),并包括ui用戶界面對(duì)象的私有實(shí)例。
3、多繼承方式:將ui文件的基類和表單的用戶接口對(duì)象都子類化。這允許從子類的范圍內(nèi)直接使用ui文件中定義的小部件。
(3-1)直接附加方式
此處,創(chuàng)建一個(gè)名為widget.ui
的ui文件:
為了使用直接附加的方法使用ui文件,直接在main.cpp中包含ui_widget.h文件:
#include "ui_widget.h"
然后在主函數(shù)中構(gòu)造一個(gè)標(biāo)準(zhǔn)的QWidget,用于創(chuàng)建widget小部件,我們則使用這個(gè)QWidget來托管由widget描述的用戶界面ui文件,完整代碼如下:
#include "ui_widget.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QWidget *w = new QWidget;
Ui::Widget ui;
ui.setupUi(w);
w->show();
return app.exec();
}
直接附加方法是一種在應(yīng)用程序中快速使用組件的簡(jiǎn)單方法。但是在實(shí)際開發(fā)中,使用Qt Designer創(chuàng)建的組件通常需要與應(yīng)用程序的其余代碼進(jìn)行緊密的集成。例如,上面提供的widget代碼將編譯并運(yùn)行,但是界面中的對(duì)象之間不會(huì)進(jìn)行交互。為了實(shí)現(xiàn)這一點(diǎn),則需要使用單繼承方法。
(3-2)單繼承方式
使用單繼承方式,需要子類化一個(gè)標(biāo)準(zhǔn)的Qt小部件,并在其中包括ui用戶界面對(duì)象的私有實(shí)例??梢圆扇∫韵聝煞N方式的任意一種:
(1)成員變量方式
(2)指向成員變量的指針
『成員變量方式』
在這種方法中,子類化了一個(gè)Qt小部件,并從構(gòu)造函數(shù)中setupUi()
用戶界面。以這種方式使用的組件將ui文件中使用的小部件和布局公開給Qt小部件子類,并提供一個(gè)標(biāo)準(zhǔn)系統(tǒng),用于在用戶界面和應(yīng)用程序中的其他對(duì)象之間建立信號(hào)和槽函數(shù)連接。
為了確??梢哉J褂糜脩艚缑妫枰谧宇惢腝t小部件描述文件中包含uic生成的頭文件,然后引用Ui::Widget(本文是Widget.ui界面文件):
子類化了一個(gè)Qt小部件子類的構(gòu)造函數(shù)通過調(diào)用ui對(duì)象的setupUi()函數(shù)來構(gòu)造和配置界面中的所有小部件和布局:
這種方法的優(yōu)點(diǎn)是:簡(jiǎn)單使用繼承來提供了基于QWidget的接口,并將用戶界面小部件變量封裝在ui數(shù)據(jù)成員中。我們可以使用這個(gè)方法在同一個(gè)小部件中定義多個(gè)用戶界面,每個(gè)界面都包含在自己的名稱空間中,并可以覆蓋(或組合)它們。
『指向成員變量的指針』
采用這種方式,對(duì)ui用戶界面對(duì)象的寫法上就變成了指向Ui::Widget
的指針:
對(duì)應(yīng)的源文件則是:
這種方法的優(yōu)點(diǎn)是:用戶界面對(duì)象可以預(yù)先聲明,這意味著不必在頭文件中包含生成的ui_Widget.h文件,然后可以在不重新編譯相關(guān)源文件的情況下更改ui文件。
可見,這兩種方法都能使用ui文件,但推薦使用指向成員變量的指針的方式使用ui文件,這也是庫和大型應(yīng)用程序開發(fā)的方法,況且使用QtCreator新文件創(chuàng)建向?qū)砑拥膗i界面類則是以這種方式生成的代碼。
(3-3)多繼承方式
使用Qt Designer創(chuàng)建的ui文件可以與標(biāo)準(zhǔn)的基于QWidget的類一起子類化。通過這種方法,可以在子類的范圍內(nèi)直接訪問ui文件中定義的所有用戶界面組件,并能夠使用connect()函數(shù)建立信號(hào)和槽函數(shù)連接。
本文創(chuàng)建了Widget.ui界面描述文件,首先則需要在子類中包含使用uic從Widget生成的頭文件:
#include "ui_widget.h"
接著在這個(gè)類的定義中需繼承QWidget和Ui::Widget,可以私有的繼承Ui::Widget,以確保用戶界面對(duì)象在子類中是私有的。當(dāng)然還可以將其與public或protected關(guān)鍵字一起繼承,就像在前面的例子中可以讓ui為public或protected一樣。如下所示:
對(duì)應(yīng)的源碼文件則是:
在多繼承方式中,用戶界面中使用的小部件的訪問方式與手工在代碼中創(chuàng)建的小部件的一樣。除此之外,我們不再需要ui前綴來訪問這些小部件了。文章來源:http://www.zghlxwxcb.cn/news/detail-792202.html
四、總結(jié)
以上三種在進(jìn)行應(yīng)用程序編譯時(shí)使用ui文件的方法,其目的都是以如何在應(yīng)用程序設(shè)計(jì)和編寫中使用UI文件中所描述的Widget為目的展開的。直接附加方法較為簡(jiǎn)單,在開發(fā)幾乎不使用。單繼承方式較為常用,其次是多繼承方式。文章來源地址http://www.zghlxwxcb.cn/news/detail-792202.html
到了這里,關(guān)于【Qt】如何在Qt應(yīng)用程序中使用設(shè)計(jì)好的UI文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!