Qt ”Hello, world!“(續(xù))

2018-10-04 10:04 更新

Hello, world!(續(xù))

下面來(lái)逐行解釋一下前面的那個(gè) Hello, world!程序,盡管很簡(jiǎn)單,但卻可以對(duì) Qt 程序的結(jié)構(gòu)有一個(gè)清楚的認(rèn)識(shí)?,F(xiàn)在再把代碼貼過(guò)來(lái):

#include <QApplication> 
#include <QLabel> 

int main(int argc, char *argv[]) 
{ 
        QApplication app(argc, argv); 
        QLabel *label = new QLabel("Hello, world!"); 
        label->show(); 
        return app.exec(); 
}

第1行和第2行就是需要引入的頭文件。和普通的 C++ 程序沒(méi)有什么兩樣,如果要使用某個(gè)組件,就必須要引入相應(yīng)的頭文件,這類(lèi)似于 Java 的 import 機(jī)制。值得說(shuō)明的是,Qt 中頭文件和類(lèi)名是一致的。也就是說(shuō),如果你要使用某個(gè)類(lèi)的話(huà),它的類(lèi)名就是它的頭文件名。

第3行是空行 :)

第4行是 main 函數(shù)函數(shù)頭。這與普通的 C++ 程序沒(méi)有什么兩樣,學(xué)過(guò) C++ 的都明白。因此你可以看到,實(shí)際上,Qt 完全通過(guò)普通的 main 函數(shù)進(jìn)入,這不同于 wxWidgets,因?yàn)?wxWidgets 的Hello, world 需要你繼承它的一個(gè) wxApp 類(lèi),并覆蓋它的 wxApp::OnInit 方法,系統(tǒng)會(huì)自動(dòng)將OnInit 編譯成入口函數(shù)。不過(guò)在 Qt 中,就不需要這些了。

第5行,噢噢,大括號(hào)…

第6行,創(chuàng)建一個(gè) QApplication 對(duì)象。這個(gè)對(duì)象用于管理應(yīng)用程序級(jí)別的資源。QApplication 的構(gòu)造函數(shù)要求兩個(gè)參數(shù),分別來(lái)自 main 的那兩個(gè)參數(shù),因此,Qt 在一定程度上是支持命令行參數(shù)的。

第7行,創(chuàng)建一個(gè) QLabel 對(duì)象,并且能夠顯示 Hello, world!字符串。和其他庫(kù)的 Label 控件一樣,這是用來(lái)顯示文本的。在 Qt 中,這被稱(chēng)為一個(gè) widget(翻譯出來(lái)是小東西,不過(guò)這個(gè)翻譯并不好…),它等同于 Windows 技術(shù)里面的控件(controls)和容器(containers)。也就是說(shuō),widget 可以放置其他的 widget,就像 Swing 的組件。大多數(shù) Qt 程序使用 QMainWindow 或者 QDialog 作為頂級(jí)組件,但 Qt 并不強(qiáng)制要求這點(diǎn)。在這個(gè)例子中,頂級(jí)組件就是一個(gè) QLabel。

第8行,使這個(gè) label 可見(jiàn)。組件創(chuàng)建出來(lái)之后通常是不可見(jiàn)的,要求我們手動(dòng)的使它們可見(jiàn)。這樣,在創(chuàng)建出組建之后我們就可以對(duì)它們進(jìn)行各種定制,以避免出現(xiàn)之后在屏幕上面會(huì)有閃爍。

第9行,將應(yīng)用程序的控制權(quán)移交給 Qt。這時(shí),程序的事件循環(huán)就開(kāi)始了,也就是說(shuō),這時(shí)可以相應(yīng)你發(fā)出的各種事件了。這類(lèi)似于 gtk+ 最后的一行 gtk_main()。

第10行,大括號(hào)……程序結(jié)束了。

注意,我們并沒(méi)有使用 delete 去刪除創(chuàng)建的 QLabel,因?yàn)樵诔绦蚪Y(jié)束后操作系統(tǒng)會(huì)回收這個(gè)空間——這只是因?yàn)檫@個(gè) QLabel 占用的內(nèi)存比較小,但有時(shí)候這么做會(huì)引起麻煩的,特別是在大程序中,因此必須小心。

好了,程序解釋完了。按照正常的流程,下面應(yīng)該編譯。前面也提過(guò),Qt 的編譯不能使用普通的 make,而必須先使用 qmake 進(jìn)行預(yù)編譯。所以,第一步應(yīng)該是在工程目錄下使用

qmake -project

命令創(chuàng)建.pro 文件(比如說(shuō)是叫 helloworld.pro)。然后再在.pro文件目錄下使用

qmake helloworld.pro (make)

或者

qmake -tp vc helloworld.pro (nmake)

生成 makefile,然后才能調(diào)用 make或者是 nmake 進(jìn)行編譯。不過(guò)因?yàn)槲覀兪褂玫氖?IDE,所以這些步驟就不需要我們手動(dòng)完成了。

值得說(shuō)明一點(diǎn)的是,這個(gè) qmake 能夠生成標(biāo)準(zhǔn)的 makefile 文件,因此完全可以利用 qmake 自動(dòng)生成 makefile——這是題外話(huà)。

好了,下面修改一下源代碼,把 QLabel 的創(chuàng)建一句改成

QLabel *label = new QLabel("<h2><font color='red'>Hello</font>, world!<h2>");

運(yùn)行一下:

同 Swing 的 JLabel 一樣,Qt 也是支持 HTML 解析的。

好了,這個(gè) Hello, world 就說(shuō)到這里!明確一下 Qt 的程序結(jié)構(gòu),在一個(gè) Qt 源代碼中,一下兩條語(yǔ)句是必不可少的:

QApplication app(argc, argv); 
//... 
return app.exec();

本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)