2010年9月30日 星期四

Qt 經驗談

大概 3~4 年前當我開始用 Qt 的時候, 那時候 Qt 4 才剛剛出來沒幾年. 之前的版本我沒用過, 但是那時 Qt 4 看起來已經算是十分的完備, 甚至我還覺得如果只把它看成是一個 UI Framework 來說已經算是撈過界了. 當然 Qt 的野心不僅於此, 許多常見的功能包括 Thread classes, Networking, Web browser engine, XML, SQL, Storage Classes, OpenGL 等等的東西, 畢竟它可是立志要當 C++ 中的 Java Framework Solution 呢. 不過當時我們只是大部分用他來作 UI 的顯示以及設定儲存上的處理罷了. (那時候 Qt 超貴的一個平台的單一 License 要10幾萬, 也沒有啥 LGPL 版跟 Qt Creator, 跟 Visual Studio 的結合也是要錢的版本才有, 整個買下來的費用真的不少. 總歸一句話, 老闆有錢真好.....)

不過當時 Qt 讓我覺得很驚艷的部分則是他的 UI Framework 可以把 View 跟 Model 的處理切得很開, 這一點在當時已經夠讓我驚訝了 (大概是我對其他的 Framework 不熟). 美工的工作僅限於把元件上的所需的圖畫好並使用 Qt 提供的工具把圖貼好 (這部分不難, 也不需要太多的時間作訓練), 然後再將改好的圖跟設定檔給我們之後跟著程式一起包出去就完成了. 當然最近 Qt 又搞了一個 QML 的 UI Script. 大概是想要把元件的屬性進一步開放給 UI 設計者可以有更多的發揮空間吧. 其實當時在早期的 Qt 版本之中就已經有提供類似的功能可以作調整, 不過是得寫在程式裡改的, 要開放出來還得費一番功夫去設計, 可以調整的東西也很有限. 但是現在很多 UI 的 Framework 其實都有遵循類似的設計, 包括最夯的 Android 也是如此. 也許 Qt 不是第一家, 但是習慣了這個模式以後很多類似這樣設計的 Framework 會讓你工作起來更得心應手.

Qt 大部分的 UI 常用原件都是用 Signal 跟 Slot 機制去實作的, 這方面 Qt  的官方文件十分清楚. 這個觀念很方便, 也可以很輕易的把 UI 的呼叫跟程式主體切開跟置換, 也沒有被介面綁標的困擾(當然還是得適可而止別亂用, 飛來飛去的 Signal 跟 Slot 有時候 Debug 起來是要人命的). 當然你也可以去覆寫 Qt 原有的事件去達到類似的目的 (有時候不得不這樣作), 但是通常非必要我不建議這麼作, 除非你可以確定你的程式沒有使用Thread. 因為在某些作業系統下如果是非主要的 Thread 去更動 UI 元件內的資料會造成程式當機 (也許這問題已經不復存在, 但是這在早期不算是新鮮事), 而貼心的 Qt 的 Signal 跟 Slot 機制已經幫你處理掉這一塊的問題了.

還有 Qt 真正的完整 View / Model UI 原件組 (List/Table View Model 之類的) 昰一定得具備的, 畢竟這是 Java 2 幾百年前就有的東西. 概念上大同小異, 只是實現的方法跟細節不同. 這方面我玩得不是很透徹, 但是我覺得似乎 Java Swing 在 Table Cell 客製化內容的顯示的實現上, 像是類似貼圖貼星星等等的東西, 似乎比 Qt 要來的簡單多了. Qt 要去做這些事情, 要搞懂的概念實在是不少.

對於多國語言的支援以及轉換, 其實 Qt 在當時做得很不錯了, 不過這需要設計師一點點小小的幫忙. 在 Qt 程式中常常會見到 tr() 的巨集指令包著字串, 很多初學者會覺得很奇怪, 為什麼要這麼做? 其實這個巨集的作用是為了做多國語言轉換的時候用的. 事先用這個巨集布局好需要翻譯的字串, 之後可以透過工具產生一份份的翻譯檔, 再把對照的字串填入到翻譯檔即可. Qt 會依照作業系統的語系自動轉換到對應的語系, 它也提供了 API 可以切換.

當然 Qt 還有很多很好用的功能, 但是並不是每個東西都這麼好用. 例如如果有效能考量, 用 Qt 的 container class 不如用 std 得還來的快. 因為各家的 編譯器大概已經把這些東西的最佳化都做得很好了. 還有善用演算法跟小技巧去加速一些繁重的工作而不完全依賴它本身提供的模組也是比較健康的思維. 

2010年9月29日 星期三

Qt SDK (Qt 4.7 + Creator 2.01) + Windows 7 SDK 開發環境安裝

雖然使用 Windows 的 Native Library 跟編譯器多少有點違背 Qt 跨平台的本意, 但是有時候要用到某些功能就不得不用. 所以就只得屈就連編譯器都用 Windows 的.

安裝環境: Windows XP SP3
因為在我的筆電下 Windows 7 環境搞不定 Qt Creator 以及 CDB 合體, 所以就放棄了.

我的做法是直接使用 Windows 7.0 SDK + .Net Framework 3.5 SP1 的版本做基礎加以整合, 因為這個版本附的 Visual C++ 2008是 Standard 版的. Qt 4.7 + VC++ 2008 做法我是參考 Heresy 的做法, 在此就不再詳述. 不過有些部分要補充說明, 那就是 Qt 4.7 已經把 Heresy 講的StructureTransitionTable.h 的程式碼做修正, 所以不用再改程式了, 但是 Webkit 以及 Script 模組連結錯誤的問題還是存在. 還有過程中一定要把防毒軟體先關掉, 因為它有可能造成編譯上的干擾讓你的安裝過程失敗.

安裝步驟如下:

  1. 下載 Windows 7.0 SDK ISO
  2. 安裝 Windows 7.0 SDK
    Debugger 跟 VC++ 編譯器一定得安裝 .Net Framework 相關的選項我都是拿掉不安裝的.
  3. 下載 Qt SDK (OpenSource版)
  4. 安裝 Qt SDK, 安裝過程中我是採用自訂並把 MinGW 拿掉不安裝.
  5. 設定環境變數
    在 [控制台]->[系統]->[進階]->[環境變數] 下新增以下變數
    QTDIR => [你安裝的 Qt DSK路徑]\qt
    PATH => %QTDIR%\bin;%PATH%
    QTMAKESPEC => win32-msvc2008
  6. 參照 Heresy 的安裝設定去做, 不過我並沒有開啟 -fast 選項
    這部分是個人喜好, 不過不開的話建議一定要開 -MP, 不然效能不是很勇猛的電腦可能睡一覺起來還在跑 (我的 i3 370 就是這樣 @@)
  7. 設定 Qt Creator 2.01
    1. 啟動主選單的 [Tools]->[Options] 按下對話框左手邊的Qt4, 如果路徑設定無誤, 應該會看到 auto-detected 的 Qt in PATH 是有找到 Qt 4.7 的. 而且 toolchain 是出現 Microsoft Visual C++ Compiler 9.0 (x86) 的選項
    2. 接下來請按下左手邊的 Debugger 並在上方選取 CDB 頁面, 請將 CDB 旁邊的 checkbox 打勾
    3. 在下方的 Path 旁邊有個 Autodetect 按鈕, 按下之後 Qt 會自動找你已經安裝的 CDB
    4. 按下下方的 Ok 鍵, 這樣算設定完成
Qt Creator 說穿了只是提供一個基本的環境可以方便大家編輯, 編譯, 以及除錯. Qt 的基礎例如像 qmake profile 還是要靠自己寫 (幸好 Qt 在這方面算是做的很好, profile 語法已經算是簡單了). qmake 對於各大編譯器的 makefile 以及 project 檔的支援做的很好. 沒幾行指令就可以產生對應各家開發工具用的專案檔案. 之後的細節有機會再詳談.

新開張

最近空閒時間比較多, 所以突然想要寫一些跟之前作過的東西有關的資料. 一方面是備忘, 另一方面希望自己的經驗可以提供其他人一些參考.

目前我秉持一個原則, 也是對自己的期許. 希望我網站的內容都是自己撰寫的部分. 如果有引用的部分, 我會註明出處. 老實講我對於一字不漏的張貼其實有點感冒, 因為當自己在找資料的時候常常會遇到很多網誌的內容完全一字不漏的張貼過來, 但是這些東西都無法解決我自己本身的問題, 卻白白浪費了搜尋的資源. 當然可能張貼的人本身也是處於想要分享的立場出發, 但是我覺得張貼未經證實的消息就跟拔獅子的鬃毛的傳說是一樣的, 不但對於知識傳遞本身是無益的, 還反而因為誤導而有害於別人的學習.

當然, 我的方法不一定是最好的, 但是在我的情況下是能動的. 如果有意見還請大家批評指教, 這樣大家也才有進步的空間.