前面幾節做了很多鋪墊,終於囉嗦完了,從本節開始,我們就要接觸真正的 Qt 程式碼了。
Qt 本身就是用 C++ 語言編寫的,所以 Qt 程式的程式碼看起來和普通的 C++ 程式碼差不了多少, 這樣就很容易上手,也適合自學。
C++ 的套路就編寫一個類,使用的時候就定義該類的物件, 然後呼叫物件的函數來完成任務。最簡化的 Qt 程式如下所示:
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow w;
w.setWindowTitle("Widgets演示"); //設定標題
w.resize(300, 140); //設定客戶區大小
QLabel label("C語言中文網", &w);
label.setGeometry(100, 50, 160, 30);
w.show();
return app.exec();
}
接著我們對程式碼進行剖析。
1) 標頭檔案
第 1~3 行程式碼引入對應的標頭檔案。在 Qt 中,標頭檔案設計的非常規範,大部分情況下一個類對應一個標頭檔案,類名和標頭檔案名相同,以字母
Q
開頭。一個控制元件對應一個類,要想使用控制元件,必須包含對應的標頭檔案。
Qt 中的標頭檔案被分門別類地放到了不同的資料夾。對於 Qt 5.9.0 MinGW 版本,標頭檔案位於安裝目錄下的 5.9mingw53_32include 資料夾中,使用 g++ 編譯器時,通過
-I
選項可以指定標頭檔案的路徑。
與介面相關的 Qt 控制元件一般都位於安裝目錄下的 5.9mingw53_32includeQtWidgets 資料夾,當使用
-I
選項指定標頭檔案檢索路徑後,通過
#include <QtWidgets/QLabel>
這樣的語句就可以成功引入標頭檔案。
2) 入口函數
Qt 程式的入口函數和 C++ Console 程式一樣,都是 main() 函數;引數也是一樣的。不了解的讀者請猛擊:main()函數的高階用法:接收使用者輸入的資料
3) QApplication 物件
第 7 行建立了一個 QApplication 物件。QApplication 類主要用來管理程式的生命週期(包括初始化設定和銷毀工作),開啟事件迴圈。對於任何一個 Qt GUI 程式,必須有且僅有一個 QApplication 物件,但可以存在零個或多個視窗。
main() 函數一般以建立 QApplication 物件開始,後面才是實際業務的程式碼。
4) QMainWindow
第 9 行程式碼中,QMainWindow 表示主視窗,它是一個頂級視窗。QMainWindow 可以包含選單欄、工具列、狀態列、標題列等,是最常見的視窗形式,可以作為 GUI 程式的主視窗。
5) QLabel 控制元件
第 13 行通過 QLabel 建立了一個標籤控制元件;標籤控制元件的作用很簡單,就是用來顯示一段文字。建構函式的第一個引數指定了要顯示的文字,第二個引數指定了父視窗。
在 Qt 中,一個控制元件可以有父輩,這個父輩可以是一個視窗,也可以是一個容器。父輩有管理控制元件的作用,當父輩被銷毀時,子控制元件也都被銷毀並釋放記憶體。
第 14 行設定 Label 控制元件的幾何尺寸,100 為左邊距,50 為上邊距,160 為控制元件寬度,30 為控制元件高度,單位都是畫素(px)。邊距是相對父輩 w 來說的。
第 15 行用來顯示控制元件。控制元件被建立後只是分配了記憶體,並不可見,還需要呼叫 show() 函數顯示出來。w 是 label 的父輩,父輩呼叫 show() 函數也會顯示所有子控制元件,所以 label 就不需要再呼叫 show() 了。
6) 訊息迴圈
exec() 使程式進入訊息迴圈,等待可能發生的事件,例如滑鼠點選、鍵盤輸入等。這裡 main() 把控制權轉交給 Qt,由 Qt 完成事件處理工作,程式退出時 exec() 的值就會返回。在 exec() 中,Qt 接受並處理使用者和系統的事件,把它們傳遞給適當的視窗控制元件。
關於訊息迴圈,在《Windows程式設計》中已經進行了詳細介紹,不了解的讀者請自行腦補。
如果使用者點選視窗的關閉按鈕, 程式就會自動結束並返回一個值,預設是 0 。
圖形程式與命令列程式一個最大的不同就是圖形程式通常不會自動關閉,而是一直等待使用者操作,所以圖形程式與使用者的互動性都很強。一般的命令列程式跑完自己就結束了,而圖形程式會等待使用者點選關閉按鈕(或退出選單項)才會結束。