鍍金池/ 教程/ C/ Hello, world!(續(xù))
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡易畫板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡易畫板的實(shí)現(xiàn)(QWidget)

Hello, world!(續(xù))

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

#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++ 程序沒有什么兩樣,如果要使用某個(gè)組件,就必須要引入相應(yīng)的頭文件,這類似于 Java 的 import 機(jī)制。值得說明的是,Qt 中頭文件和類名是一致的。也就是說,如果你要使用某個(gè)類的話,它的類名就是它的頭文件名。

第3行是空行 :)

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

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

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

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

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

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

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

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

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

qmake -project

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

qmake helloworld.pro (make)

或者

qmake -tp vc helloworld.pro (nmake)

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

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

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

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

運(yùn)行一下:

http://wiki.jikexueyuan.com/project/learn-road-qt/images/8.png" alt="" />

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

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

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

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