【干貨】如何搭建QT開(kāi)發(fā)環(huán)境
來(lái)源:原創(chuàng) 時(shí)間:2017-04-18 瀏覽:0 次
Qt 是一個(gè)跨平臺(tái)的 C++應(yīng)用手續(xù)研發(fā)框架。它提提供研發(fā)者樹(shù)立圖形用戶(hù)界 面所需的功能,廣泛用于研發(fā) GUI 手續(xù),也可用于研發(fā)非 GUI 手續(xù)。Qt 是絕對(duì) 面向?qū)ο蟮?很容易擴(kuò)展,況且準(zhǔn)許真正地組件編程。Qt 運(yùn)用標(biāo)準(zhǔn)的 C++和特別的代碼生成擴(kuò)展(稱(chēng)為元對(duì)象編譯器 Meta Object Compiler, moc)以及一點(diǎn)宏。
基本上,Qt 同 X11 上的 GTK、Motif、Openwin 和 Windows 上的 MFC,OWL, VCL,ATL 是同類(lèi)型的物品,不過(guò) Qt 支持更多的平臺(tái)(涵蓋 Microsoft Windows、GNU/Linux、Mac OS X、Android、iOS、WinCE、UNIX 親族等),面向?qū)ο笄野鍓K化程度更高(Qt 供給了一種稱(chēng)為 signals/slots 的安全類(lèi)型來(lái)代替 callback,這 要得各個(gè)元件之間的協(xié)同辦公變得非常簡(jiǎn)單),浩博的API(Qt 涵蓋多達(dá) 250個(gè) 以上的C++ 類(lèi)還供給基于模型板類(lèi)的collections,serialization,file,I/Odevice,directory,management, date/time 類(lèi)。甚至于還涵蓋正則表現(xiàn)式的處置功能),支 持 2D/3D 圖形渲染,支持 OpenGL、數(shù)量多的研發(fā)文檔、XML 支持等。運(yùn)用 Qt 研發(fā)的軟件,相同的代碼可以在不論什么支持的平臺(tái)上編譯運(yùn)行,而不必改正源代 碼。它會(huì)半自動(dòng)依據(jù)平臺(tái)的不一樣,表達(dá)平臺(tái)特有的圖形界面風(fēng)格。
通過(guò)積年進(jìn)展,Qt 不惟領(lǐng)有了完善的 C++圖形庫(kù),并且近年來(lái)的版本漸漸集成了數(shù)值庫(kù)、OpenGL 庫(kù)、多電視臺(tái)庫(kù)、網(wǎng)路、腳本代碼庫(kù)、XML 庫(kù)、WebKit 庫(kù)等等, 其中心庫(kù)也參加了進(jìn)程項(xiàng)間通信、多線程等板塊,莫大地浩博了 Qt 研發(fā)大規(guī)模復(fù) 雜跨平臺(tái)應(yīng)用手續(xù)的有經(jīng)驗(yàn),真正意義上成功實(shí)現(xiàn)了其開(kāi)發(fā)宗旨“Code Less; Create More; Deploy Anywhere.”

二
QT 在 windows 下的背景建造
在 windows 背景下,可以運(yùn)用 vs+qt 的研發(fā)背景施行項(xiàng)目研發(fā),背景建造時(shí)有點(diǎn)細(xì)節(jié)要注意:
1
下載
下載時(shí)要注意下載和 vs 版本相般配的 qt 版本,以及 Add-in 工具。找到對(duì)應(yīng) 的版本施行下載,里邊粉和水發(fā)酵制成的食品含多種不一樣的版本,MSVC2010、MSVC2012 作別是指支 持 VS2010 與 VS2012 的 Qt 版本,而 opengl 與非 opengl 的差別是是否支持 opengl, android、ios 作別是指支持 android、ios 平臺(tái)的 Qt 版本。這處我挑選的版本(已示明),如下所述:
qt-windows-opensource-5.2.0-msvc2010_opengl-x86-offline.exe(opengl版本)
Visual Studio Add-in 1.2.2 for Qt5
如圖:
2
安裝
qt-windows-opensource 與 Visual Studio Add-in 的安裝順著次序沒(méi)關(guān)系要求,安裝途徑不要里面含有漢字、空格、特別字符(~<>?*!@#$百分之百^&:,;)。 安裝完成 Visual Studio Add-in 在這以后,VS 便會(huì)顯露出來(lái)相應(yīng)的 Qt 選項(xiàng)!
3
配備布置研發(fā)背景
挑選:Qt5->Qt Options->Add,配備布置 VS 的研發(fā)背景。
這處依據(jù)自個(gè)兒的 Qt 安裝途徑施行挑選,Path 為: D:SoftwareQtQt5.2.0.2.0msvc2010_opengl。 到這處,研發(fā)背景就配備布置完成了,可以導(dǎo)入還是新建項(xiàng)目了。
導(dǎo)入Qt的pro項(xiàng)目。
挑選:Qt5->Open Qt Project File(.pro)...
新建Qt項(xiàng)目
挑選:文件->新建->項(xiàng)目->Qt5 Projects->Qt Application,輸入工程名,下一步...施行新建。
新建完成在這以后,就可以運(yùn)行了!
三
QT 的一點(diǎn)獨(dú)特的地方以及簡(jiǎn)單運(yùn)用
1
圖形用戶(hù)界面
Qt 的圖形用戶(hù)界面的基礎(chǔ)是 QWidget。Qt 中全部類(lèi)型的 GUI 組件如按鍵、標(biāo)簽、工具欄等都分化自 QWidget,而 QWidget 本身則為 QObject 的子類(lèi)。Widget 負(fù)責(zé)收繳鼠標(biāo),鍵盤(pán)和來(lái)自窗戶(hù)系統(tǒng)的其它事情,并描畫(huà)了自身顯露在熒幕上。 每一個(gè) GUI 組件都是一個(gè) widget,widget 還可以作為器皿,在其內(nèi)部面含有其它 Widget。
下邊以登陸窗戶(hù)為例:
左側(cè)的列表是 QT 的控件列表,列表中的全部控件都可以放在 QWidget 上。 QWidget 顯露有經(jīng)驗(yàn)里面含有了透明化等功能。 設(shè)置透明化,有幾種形式,我們這處用到的是設(shè)置式樣表的形式,下邊的例子是設(shè)置 QLineEdit 控件透明沒(méi)有邊際框。
如圖:

Qt 供給一種托管機(jī)制,當(dāng) Widget 于開(kāi)創(chuàng)時(shí)指定父對(duì)象,就可把自個(gè)兒的性命 周期交付領(lǐng)導(dǎo)對(duì)象管理,當(dāng)領(lǐng)導(dǎo)對(duì)象被開(kāi)釋時(shí),自個(gè)兒也被開(kāi)釋。保證對(duì)象不再使 用時(shí)都會(huì)被刪去。
這個(gè)登陸窗戶(hù)中的全部控件的父 widget 都是這個(gè)窗戶(hù),所以在窗戶(hù)被毀掉時(shí), 全部控件也同時(shí)被毀掉,不必自個(gè)兒去扼制。所以析構(gòu)函數(shù)的成功實(shí)現(xiàn)函數(shù)中可以不施行處置,代碼如下所述:
LoginDialog::~LoginDialog() {
}
2
信號(hào)與槽機(jī)制(Signals and Slots)
Qt 利用信號(hào)與槽(signals/slots)機(jī)制代替?zhèn)鹘y(tǒng)的 callback 來(lái)施行對(duì)象之間的溝通。當(dāng)操作事情發(fā)生的時(shí)刻,對(duì)象會(huì)發(fā)射一個(gè)信號(hào)(signal);而槽(slot)則 是一個(gè)函數(shù)接納特別指定信號(hào)況且運(yùn)行槽本身設(shè)置的動(dòng)作。信號(hào)與槽之間,則經(jīng)過(guò) QObject 的靜態(tài)辦法 connect 來(lái)鏈接。
例如:
connect(ui.pushButton_close, SIGNAL(clicked()), this, SLOT(closeSlot()));
當(dāng)關(guān)閉按鍵被點(diǎn)擊時(shí),會(huì)被觸動(dòng)引發(fā) QPushButton 的 clicked()信號(hào),信號(hào)被發(fā)射在這以后, 會(huì)連署到收繳者定義的槽函數(shù)中,這處是 closeSlot();
信號(hào)在不論什么運(yùn)行點(diǎn)上皆可發(fā)射,甚至于可以在槽里再發(fā)射另一個(gè)信號(hào),信號(hào)與槽的鏈接不框定為一對(duì)一的鏈接,一個(gè)信號(hào)可以鏈接到多個(gè)槽或多個(gè)信號(hào)鏈接到 同一個(gè)槽,甚至于信號(hào)也可連署到信號(hào)。
信號(hào)與槽機(jī)制也保證了低耦合性,送出信號(hào)的類(lèi)并不曉得是哪一個(gè)槽會(huì)接納, 也就是說(shuō)一個(gè)信號(hào)可以調(diào)配使用全部可用的槽。此機(jī)制會(huì)保證當(dāng)在”連署”信號(hào)和槽時(shí), 槽會(huì)接納信號(hào)的參變量況且準(zhǔn)確運(yùn)行。
這處,我想談的是 Qt 總算創(chuàng)造了 signal/slot,這個(gè)思想也被其它一點(diǎn)框架語(yǔ) 言吸收了。
談 signal/slot 之前先來(lái)談?wù)?C++的缺欠,這處只談一點(diǎn)兒,C++的預(yù)設(shè)目的是面 向?qū)ο笳Z(yǔ)言,它不止供給了對(duì)象的定義和構(gòu)建的形式,也定義了對(duì)象間的關(guān)系, 譬如 秉承 分化 聚合,不過(guò)它沒(méi)有供給對(duì)象間通信和共享數(shù)值的形式,這個(gè)缺 點(diǎn)在普通手續(xù)的研發(fā)上不算個(gè)大問(wèn)題,我們可以自個(gè)兒簡(jiǎn)單成功實(shí)現(xiàn),不過(guò)對(duì)于 GUI 研發(fā),這個(gè)欠缺就被放大了眾多倍。GUI 上的對(duì)象真的非常多,窗戶(hù)是對(duì)象,布局 是對(duì)象,定時(shí)器是對(duì)象,并且對(duì)象間有縱橫交錯(cuò)的關(guān)系,通信和數(shù)值交換十分次數(shù)多,譬如按鍵按下要通告父窗戶(hù)或器皿對(duì)象,骨碌條變動(dòng)了要通告列表對(duì)象。這 種數(shù)目極大的對(duì)象以及復(fù)雜的通信關(guān)系,可不是自個(gè)兒搞個(gè)簡(jiǎn)單的成功實(shí)現(xiàn)就能解決的。
說(shuō)到通信和共享,實(shí)際上它們是一回事,共享很很長(zhǎng)時(shí)間候就是為了通信,而 C++ 里要通信就定然要共享。
譬如,一個(gè)類(lèi)實(shí)際的例子領(lǐng)有另一個(gè)的指針,就可以過(guò)訪對(duì)方的數(shù)值,調(diào)配使用對(duì)方的 辦法了,這實(shí)際就是共享了一個(gè)指針,這個(gè)類(lèi)指針也是另一個(gè)對(duì)象的 this。過(guò)訪 數(shù)值和調(diào)配使用辦法實(shí)際上都是通信,把對(duì)方的數(shù)值拿過(guò)來(lái),把自個(gè)兒的數(shù)值送以往,交 換數(shù)值就是通信。
在 C++里,因?yàn)闆](méi)有 GC,管理數(shù)量多原生指針曲直常危險(xiǎn)的,對(duì)象的性命周期 不可以控,野指針的顯露出來(lái)幾率會(huì)頎長(zhǎng),大型 C++ 的 GUI 項(xiàng)目參加研發(fā)的人次很多, 很保不住證都不犯錯(cuò)。
那末發(fā)消息兒好不好呢?譬如 MFC 那樣子,可以,不過(guò)實(shí)質(zhì)上仍然共享了窗戶(hù)句 柄,否則消息兒發(fā)給誰(shuí)呢?并且還帶來(lái)額外的問(wèn)題,就是類(lèi)型安全,消息兒的參變量是 沒(méi)有辦法類(lèi)型安全的。
Qt 作為大型 GUI 項(xiàng)目標(biāo) Framework,它務(wù)必解決這個(gè)問(wèn)題,否則這個(gè)手續(xù)是 寫(xiě)半大的,寫(xiě)大了便會(huì)問(wèn)題接連不斷。
來(lái)看一段代碼,看看 Qt 的解決方案: Window::Window()
{
QPushButton *b = new QPushButton(this);
connect(b, SIGNAL(clicked()), SLOT(on_button_clicked())); }
Window::on_button_clicked() {
QPushButton *b = qobject_cast<QPushButton*>(sender());
b->setText("clicked!"); }
這段代碼,經(jīng)過(guò) Qt 的 signal slot 機(jī)制,把 QPushButton 的點(diǎn)擊事情連署到達(dá) Window 的 on_button_clicked 響應(yīng)函數(shù)上。
3
布局管理
布局管理類(lèi)用于描寫(xiě)一個(gè)應(yīng)用手續(xù)的用戶(hù)界面中的Widget是怎么樣安放。當(dāng)視窗縮放時(shí),布局管理器會(huì)半自動(dòng)調(diào)試 widget 的體積、位置或是字號(hào),保證它們相 對(duì)的排列和用戶(hù)界面群體還是持有可用性。
Qt 內(nèi)置的布局管理類(lèi)型有:QHBoxLayout、QVBoxLayout,QGridLayout 和 QFormLayout。這些個(gè)類(lèi)秉承自 QLayout,但 QLayout 非秉承自 QWidget 而是直接 源于 QObject。它們負(fù)責(zé) widget 的幾何管理。想要開(kāi)創(chuàng)更復(fù)雜的版面配備布置,可以 秉承 QLayout 來(lái)自定義版面配備布置管理員。
上圖中被紅框圈起來(lái)的,是頁(yè)面中的布局,布局可以用手寫(xiě),我們這處只展覽預(yù)設(shè) 師中處置的布局。布局分為四種,我們這處用到達(dá)簡(jiǎn)單的兩種,橫向布局 (QHBoxLayout)向布局(QVBoxLayout)。
如上所述圖所示。
到這處截止,只紹介了 qt 的一點(diǎn)基本的初步學(xué)會(huì)知識(shí),大家經(jīng)過(guò) qt 的界面文件 中的布局和信號(hào)處置,就可以完成一個(gè)簡(jiǎn)單的 Qt 小手續(xù)啦!