Qt學習之路(3):Hello, world!(續)
來源:互聯網
上載者:User
下面來逐行解釋一下前面的那個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();