C++ 入門指南 4.01
單元 24 - 認識第三方程式庫 - Qt
除了標準程式庫 (standard library) 之外, C++ 還有為數眾多的第三方程式庫 (third party library) ,其中較為簡單且開放原始碼 (open source) 的 GUI 程式庫就是 Qt 了
Qt 是從 1991 年開始發展的,取名為 Qt 據說是因為 Q 在 Haavard 的 Emacs 字體特別漂亮,至於 t 則是 toolkit 的縮寫。 Qt 的最主要特色的就是跨平台 (cross-platform) 支援,例如
- Linux
- MS-Windows
- Mac
- Symbian
- Android
- iOS
等等,亦表現平台特色的圖形使用者介面 (graphical user interface) 。
雖說 Qt 知名於他的 GUI 應用,不過 Qt 程式庫包含如下各種應用
- SQL 資料庫存取
- XML 剖析
- 執行緒管理
- 網路程式設計
- 檔案處理
有些可能會和標準程式庫中的應用重複,例如 Qt 中處理字串 (string) 的型態 (type) 為 QString ,這與標準程式庫中的 string 也是不同的。
現在的 Qt 是由芬蘭的 Digia 公司維護,除了有商業授權外,也有 GPL/LGPL 的社群版授權,可以此開發自由軟體,自己下載來寫練習程式 (program) 也是沒有問題的。
下載 Qt 首先連到計畫的官網
點擊〔Download.Try.〕,就進入下載的網頁,這裡分成商業版及社群版,商業版在試用期結束後要付月費才能繼續使用,如果是學習 Qt ,這裡選擇社群版下載安裝即可。
請選擇最新的 Qt 版本,本書範例採用 6.2 ,這會連帶安裝相關的編譯工具,約 4.88GB 左右的空間,詳細下載安裝過程,請參考如何安裝 Qt 。
我們打開 Qt Creator ,先點擊〔範例〕頁籤,可以看到 Qt Creator 提供了超過不少個範例程式
〔教學〕及左邊〔說明〕的頁籤也提供大量的教學及說明文件,更多的資料包括範例也可到官網查詢。
我們藉由範例先來看看 Qt 有什麼魅力吧!點擊任一範例都可開啟專案,然後左下方有個像是媒體播放器的綠色執行鈕,點擊這個按鈕,專案就會編譯執行,例如以下為 Calqlatr 的執行視窗
這是用 Qt 做的計算機,打開了就玩玩看囉
藉由範例是學習 GUI 的絕佳途徑,開啟專案後,可再由選單中〔檔案〕的〔開啟檔案或專案〕打開專案裡的原始檔案。
玩一個還意猶未盡的話,旁邊還有個 flipable 翻牌小範例,也來玩玩囉
先點左邊的牌,可以看到翻牌動畫
再點右邊的牌,可以看到第二種翻牌動畫
接下來,我們先來介紹 Qt Creator 吧!
中英文術語對照 | |
---|---|
跨平台 | cross-platform |
圖形使用者介面 | graphical user interface |
開放原始碼 | open source |
程式 | program |
標準程式庫 | standard library |
字串 | string |
第三方程式庫 | third party library |
型態 | type |
重點整理 |
---|
1. 除了標準程式庫外, C++ 還有為數眾多的第三方程式庫。 |
2. Qt 為知名的 GUI 應用程式庫,除了 GUI 外, Qt 也具有多種應用。 |
3. Qt Creator 為 Qt 官方提供的整合開發環境,除了可以寫程式外還有文件及大量的範例檔案。 |
問題與討論 |
---|
1. 為什麼 Qt 要另外定義 QString ,而非直接運用標準程式庫中的 string ? |
2. 整合開發環境跟文字編輯器有什麼不同?兩者各有哪些優點或缺點? |
練習 |
---|
1. 標準程式庫中的 string 提供字串許多物件功能,寫一個程式 exercise2401.cxx ,利用 empty() 判斷字串是否是空字串,如果是空字串就印出 "空字串" ,否則印出字串完整內容。 參考程式碼 |
2. 承上題,寫一個程式 exercise2402.cxx ,先宣告一個英文句子的字串變數,然後用 append() 附加一個空格,再用 append() 附加另一段英文句子,最後印出來。 參考程式碼 |
3. 承上題,寫一個程式 exercise2403.cxx ,先宣告一個字串變數如 "Fr yr mnd" ,然後利用 insert() 插入母音及句點, insert() 的第一個參數為索引值,第二個參數則是要插入的英文字串,最後印出完整句子。 參考程式碼 |
4. 承上題,寫一個程式 exercise2404.cxx ,先宣告兩個英文句子的字串變數,兩個英文句子有一個單字的差異,後利用 compare() 兩個英文句子是否相同,印出結果,再利用參數設定指定範圍的索引值,比較索引值範圍的子字串是否相同,同樣印出結果。 參考程式碼 |
5. 承上題,寫一個程式 exercise2406.cxx ,先宣告一個英文句子的字串變數,例如 "Free your hand." ,然後利用 replace() 置換索引值 10 到 13 的文字,這裡 10 與 13 為 replace() 頭兩個參數,要置換的文字如 "mind" 為第三個參數,最後印出置換後的英文句子。 參考程式碼 |
6. 承上題,寫一個程式 exercise2406.cxx ,先宣告一個英文句子的字串變數,例如 "There is no spoon." ,然後利用 substr() 逐行印出每個英文單字, substr() 需要兩個參數,第一個參數為子字串的起始字元,第二個參數為結束字元。 參考程式碼 |
7. 承上題,寫一個程式 exercise2407.cxx ,先宣告一個英文句子的字串變數,例如 "There is no spoon." ,然後利用 find() 尋找是否存在指定的子字串,結果回傳 size_type 型態的索引值,先找子字串像是 "is" ,然後在指定索引值在後再次尋找,如果找到就印出索引值,沒找到印出 -1 。 參考程式碼 |
8. 承上題, C++20 新增了判斷字串開頭子字串的 starts_with() ,寫一個程式 exercise2408.cxx ,先宣告一個英文句子的字串變數,例如 "Free your mind." ,然後利用 starts_with() 判斷開頭是否為 "Free" 及 "free" ,並把結果印出來。 參考程式碼 |
9. 承上題, C++20 也新增了判斷字串結尾子字串的 ends_with() ,寫一個程式 exercise2409.cxx ,先宣告一個英文句子的字串變數,例如 "Free your mind." ,然後利用 starts_with() 判斷結尾是否為 "mind" 及 "." ,並把結果印出來。 參考程式碼 |
10. 承上題, pop_back() 可以移除字串的最後一個字元, push_back() ,寫一個程式 exercise2410.cxx ,先宣告一個英文句子的字串變數,例如 "Free your mind," ,利用 pop_back() 移除掉最後的逗點,再用 push_back() 加入句點,然後印出修改前後的對照。 參考程式碼 |
相關教學影片