下面來逐行解釋一下前面的那個Hello, world!程序,盡管很簡單,但卻可以對Qt程序的結構有一個清楚的認識。現在再把代碼貼過來:
#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++程序沒有什麼兩樣,如果要使用某個組件,就必須要引入相應的頭文件,這類似於Java的import機制。值得說明的是,Qt中頭文件和類名是一致的。也就是說,如果你要使用某個類的話,它的類名就是它的頭文件名。
第3行是空行 :)
第4行是main函數函數頭。這與普通的C++程序沒有什麼兩樣,學過C++的都明白。因此你可以看到,實際上,Qt完全通過普通的main函數進入,這不同於wxWidgets,因為wxWidgets的Hello, world需要你繼承它的一個wxApp類,並覆蓋它的wxApp::OnInit方法,系統會自動將OnInit編譯成入口函數。不過在Qt中,就不需要這些了。
第5行,噢噢,大括號…
第6行,創建一個QApplication對象。這個對象用於管理應用程序級別的資源。QApplication的構造函數要求兩個參數,分別來自main的那兩個參數,因此,Qt在一定程度上是支持命令行參數的。
第7行,創建一個QLabel對象,並且能夠顯示Hello, world!字符串。和其他庫的Label控件一樣,這是用來顯示文本的。在Qt中,這被稱為一個widget(翻譯出來是小東西,不過這個翻譯並不好…),它等同於Windows技術裡面的控件(controls)和容器(containers)。也就是說,widget可以放置其他的 widget,就像Swing的組件。大多數Qt程序使用QMainWindow或者QDialog作為頂級組件,但Qt並不強制要求這點。在這個例子中,頂級組件就是一個QLabel。
第8行,使這個label可見。組件創建出來之後通常是不可見的,要求我們手動的使它們可見。這樣,在創建出組建之後我們就可以對它們進行各種定制,以避免出現之後在屏幕上面會有閃爍。
第9行,將應用程序的控制權移交給Qt。這時,程序的事件循環就開始了,也就是說,這時可以相應你發出的各種事件了。這類似於gtk+最後的一行gtk_main()。
第10行,大括號……程序結束了。
注意,我們並沒有使用delete去刪除創建的QLabel,因為在程序結束後操作系統會回收這個空間——這只是因為這個QLabel占用的內存比較小,但有時候這麼做會引起麻煩的,特別是在大程序中,因此必須小心。
好了,程序解釋完了。按照正常的流程,下面應該編譯。前面也提過,Qt的編譯不能使用普通的make,而必須先使用qmake進行預編譯。所以,第一步應該是在工程目錄下使用
qmake -project
命令創建.pro文件(比如說是叫helloworld.pro)。然後再在.pro文件目錄下使用
qmake helloworld.pro (make)
或者
qmake -tp vc helloworld.pro (nmake)
生成makefile,然後才能調用make或者是nmake進行編譯。不過因為我們使用的是IDE,所以這些步驟就不需要我們手動完成了。
值得說明一點的是,這個qmake能夠生成標准的makefile文件,因此完全可以利用qmake自動生成makefile——這是題外話。
好了,下面修改一下源代碼,把QLabel的創建一句改成
QLabel *label = new QLabel("<h2><font color='red'>Hello</font>, world!<h2>");
運行一下:
同Swing的JLabel一樣,Qt也是支持HTML解析的。
好了,這個Hello, world就說到這裡!明確一下Qt的程序結構,在一個Qt源代碼中,一下兩條語句是必不可少的:
QApplication app(argc, argv);
//...
return app.exec();
出處: http://devbean.blog.51cto.com/448512/194137