不使用 qmake 建置 Qt Designer 產生的程式:手動建置

| | 0 Comments| 13:49
Categories:

之前花了好一段時間,終於成功地用 Visual Studio 2010 把 Qt 整個建置出來了;而接下來,就是來用 Qt 了∼基本上,Heresy 這邊應該是會使用 Qt Designer 來做圖形介面的設計,然後用 Visual Studio 2010 來做其他部分程式的開發、偵錯;不過在這篇 Heresy 不會對 Qt Designer 做詳細的介紹,有需要的人請直接參考官方的手冊(Qt Designer 4.6)。

基本 Qt 相關建置說明

為了可以順利地建置使用 Qt 的應用程式,Qt 針對不同的需求,提供三種自己的編譯器讓開發者使用,分別是:User Interface Compiler (uic)、Resource Compiler (rcc)、Meta-Object Compiler (moc)。使用 Qt Designer 來開發 Qt 的應用程式的話,就是要透過這三種編譯器,將檔案轉換為 C 編譯器可以支援的內容,來進行程式的建置。在 Heresy 來看,某種程度上,這三個編譯器做的事,其實應該比較接近轉換器吧?

而在 Windows 的話,這些 compiler 的檔案應該會在「C:Qt<version>qt\bin」的目錄下可以找到;Linux 的話,Heresy 比較不確定,不過可能是要視 distribution 而定(Heresy 這邊的是在「/usr/bin」)。

下面就是針對這三者的簡易說明:

1. User Interface 檔 (.ui)

首先,用 Qt Designer 設計出來的 Widget 或 Windows,都會是 .ui 檔(user interface)、內容則是 XML,裡面則是描述這個 UI 的內容;這種 .ui 檔案一般來說透過 Qt 的 User Interface Compiler、也就是 uic 來先做編譯,將他轉換成 C 編譯器支援的格式。而這個指令相當簡單,就是:

uic FILENAME.ui -o ui_FILENAME.h

其中,「FILENAME.ui」就是 Qt Designer 產生的檔案,「ui_FILENAME.h」則是使用 UIC 編譯產生出來的 C 標頭檔,檔案名稱是可以視需要自行調整的。而更完整的 UIC 參數介紹,則可以參考 Qt 的 UIC 官方文件

2. Qt Resource 檔 (.qrc)

而如果在 Qt Designer 的圖形介面裡有用到 resource(資源,一般是 icon 或圖檔,可參考《Editing Resources with Qt Designer》)的話,則還會產生額外的資源檔,這種檔案一般會是附檔名是 .qrc 的 XML 檔;而這些檔案在要進行編譯前,和 .ui 一樣,需要經過特別的處理。

這邊需要的步驟,是先用 Qt 的 Resource Compiler、也就是 rcc 來編譯,把 .qrc 中有用到的檔案,產生 C 形式的資料,來讓 C 程式可以使用;他的指令最簡單的形式一樣很單純,如下:

rcc FILENAME.qrc -o qrc_FILENAME.cpp

這邊的「FILENAME.qrc」就是 Qt Designer 產生的資源檔,「qrc_FILENAME.cpp」則是使用 RCC 編譯產生出來的 C 檔案;而這個例子是沒有加任何額外的參數,如果有需要的話,也可以加上類似「-compress」這類的參數,來針對輸出結果做一些設定;更完整的參數介紹,請參考 Qt 的 RCC 官方文件

3. 使用 macro Q_OBJECT 的檔案

基本上 Qt Designer 只是設計一個圖形介面出來,他會透過產生出來了 .ui 和 .qrc 檔,來實作一個這個圖形介面的 C class;而要使用這種產生出來的 UI class,程式開發者當然也是需要再自己寫一些程式的∼

至於要怎麼寫呢?可以參考《Using a Designer UI File in Your Application》這篇文章,但是由於這不是本篇重點,所以 Heresy 不會在這一部分花太多的時間。不過,實際上要能寫一個比較複雜的 Qt 的程式、例如有要自訂 signal / slot 的話,勢必會要用到 Qt 的「Q_OBJECT」這個巨集(macro),也就是文中的「The Single Inheritance Approach」或「The Multiple Inheritance Approach」。而如果在自己編寫的程式碼裡有用到「Q_OBJECT」的話,那這部分的程式碼,就必須要先經過 Qt 的 Meta-Object Compiler、moc 來做編譯了!他的基本語法是:

moc FILENAME.cpp -o moc_FILENAME.cpp

「FILENAME.cpp」是有用到「Q_OBJECT」、需要使用 MOC 來編譯的檔案,而「moc_FILENAME.cpp」則是產生出來的結果;雖然 Heresy 在這邊沒有下額外的參數,但是相較於 UIC 和 RCC,MOC 有較多可能是必要性的參數需要控制,這點可能是要注意的。關於 MOC 的參數,請參考官方的 MOC 文件

簡單範例

上面算是簡單說明了在開發 Qt 程式時,三種需要特別處理的檔案類型。而實際上在使用的時候呢?這邊 Heresy 用一個簡單的例子來講。這個簡單的 Qt 程式的例子可以點選這裡下載,裡面程式需要的部分,會有五個檔案,包括了:

  • test_window.ui
    用 Qt Designer 建立的一個視窗(MainWindow),需要使用 UIC 來先做編譯,編譯後會產生 ui_test_window.hpp 這個檔案。
  • resource.qrc
    test_window.ui 需要用到的資源檔,需要使用 RCC 來編譯,編譯後會產生 qrc_resource.hpp 這個檔案。
  • Heresy.png
    resource.qrc 內所引用的圖檔,在使用 RCC 編譯 resource.qrc 時會用到。
  • window.hxx
    使用 test_window.ui、並實作所需要的 slot 的 class CTestWindow,裡面會使用到 ui_test_window.hpp 和 qrc_resource.hpp 這兩個產生出來的檔案;需要使用 MOC 來編譯,編譯後會產生 moc_window.hpp 這個檔案。
  • main.cpp
    包含 main() 的主程式檔案,會 include moc_window.hpp。

使用 Visual C 的 cl 建置

而要建置出可執行檔的話,在 Windows 上要先開啟 Visual Studio 的 Command Prompt,並切換到檔案所在的資料夾(下面的例子是「D:QtTest」);而整個流程應該會是類似下面這樣子:

D:QtTest>set QTDIR=C:Qt2010.05-rc1qt\bin
D:QtTest>set QTHEADERPATH=C:Qt2010.05-rc1qtinclude
D:QtTest>set QTLIBPATH=C:Qt2010.05-rc1qtlib

D:QtTest>%QTDIR%uic test_window.ui -o ui_test_window.hpp
D:QtTest>%QTDIR� resource.qrc -o qrc_resource.hpp
D:QtTest>%QTDIR%moc window.hxx -o moc_window.hpp

D:QtTest>cl -I %QTHEADERPATH% main.cpp %QTLIBPATH%QtCore4.lib %QTLIBPATH%QtGui4.lib
Microsoft (R) 32-bit C/C   Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
C:Qt2010.05-rc1qtlibQtCore4.lib
C:Qt2010.05-rc1qtlibQtGui4.lib

D:QtTest>

image建置完成後,應該就會產生 main.exe 的執行檔,執行之後,就會叫出如右圖的視窗了∼其中,按鈕上的圖案就是 Heresy.png 這個圖檔;而按下中間的「Test Button」,就會觸發到自定義的 slotButtonRelease() 這個 slot,而去修改按鈕上顯示的文字。

而上面文字的部分呢,其中黃色的部分是輸入的指令,白色則是系統輸出的內容。一開始三行的 set 指令,是在定義新的變數 QTDIR、QTHEADERPATH、QTLIBPATH,以方便之後使用;這主要是在簡化之後的輸入,不打也是可以的。而路徑的部分,也需要是自己的系統 Qt 裝在哪裡來決定。

接下來三行命令,就是分別呼叫 QTDIR 下的 uic、rcc、moc 來對 Qt 的檔案進行編譯了!而在這三行命令執行完成後,目錄下應該就會多出 ui_test_window.hpp、qrc_resource.hpp 和 moc_window.hpp 這三個檔案。

最後,就是透過 Visual C 的 cl 來對 main.cpp 進行編譯了∼而基本上,這部分就和編譯一般的程式一樣了∼就是記得要加上 Qt 的 include 路徑、以及必要的 *lib 檔,應該就可以了。

使用 Linux g 建置

先聲明,Heresy 對 linux 更不熟,所以這部分 Heresy 只確認能在自己操作的 Gentoo 上順利建置;在其他的系統下,有可能會要做一些調整。

基本上,在 Gentoo 上安裝完 Qt 後,uic / rcc / moc 這些執行檔,都會在 /usr/bin 裡,而 Qt 的 header 檔以及 library 檔,則是會在 /usr/include/qt4/usr/lib/qt4

而執行的步驟呢,基本上和使用 VC 時是大同小異的∼

(SERVER:/heresy/QtTest) heresy% uic test_window.ui -o ui_test_window.hpp
(SERVER:/heresy/QtTest) heresy% rcc resource.qrc -o qrc_resource.hpp
(SERVER:/heresy/QtTest) heresy% moc window.hxx -o moc_window.hpp
(SERVER:/heresy/QtTest) heresy% g   -I /usr/include/qt4 main.cpp -L/usr/lib/qt4 -lQtCore -lQtGui
(SERVER:/heresy/QtTest) heresy%

在建置完成後,會產生 a.out 的檔案,執行它就可以叫出同樣的測試用的 Qt test Window 了!

這篇基本上就先到這裡了,內容其實很簡單地去建置一個超級簡單的 Qt 專案;不過,實際上因為 Heresy 自己對於 Qt 也是在亂摸,所以不見得這樣算是最好的方法就是了。

而接下來,應該會再整理一下以這種建置方法為基礎,去編寫一份 GNU make 的 Makefile、以及在 Visual Studio 2010 使用 Custom Build 的工具來建立專案的方法。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *