想要在 EncryptWindow 中使用 Encrypt 類別 (class) ,就得將 encrypt.cpp 加入 encrypt_gui 專案 (project) 之中
我們這裡介紹在 Qt Creator 中新增類別檔案的方式,點擊選單〔檔案〕的〔新增檔案或專案(N)...〕
就會出現「新增」視窗,我們選擇「檔案與類別」中 C++ 的 C++ Class ,然後點擊右下角的〔Choose...〕
接著輸入類別名稱 Encrypt ,自動產生兩個檔名 encrypt.h 與 encrypt.cpp ,然後點擊右下角的〔繼續〕
最後出現「專案管理」,這裡點擊右下角的〔完成〕即可
結束類別精靈後,我們可以看到 Qt Creator 中已經增加了 encrypt.h 與 encrypt.cpp 兩個檔案,檔案內容則是預設的類別、建構函數 (constructor) 的宣告
就把原本發展好的 encrypt.h 與 encrypt.cpp 複製貼上吧!
接下來開始整合的工作囉!首先,我們在要 EncryptWindow 中使用 Encrypt 的功能,就得增加一個 Encrypt 型態 (type) 的資料成員 (data member) ,如下
038 | // 解碼核心 |
039 | Encrypt *e; |
完整程式請參考 encryptwindow.h 。
建構函數的部份,我們在初值串列 (initializer list) 的地方將 e 的初值設定為 NULL ,這是 C++ 中特定的巨集 (macro) ,表示什麼都沒有的指標 (pointer)
008 | // 建構函數 |
009 | EncryptWindow::EncryptWindow(QWidget *parent) : |
010 | QMainWindow(parent), |
011 | ui(new Ui::EncryptWindow), |
012 | e(NULL) |
013 | { |
014 | ui->setupUi(this); |
015 | } |
完整程式請參考 encryptwindow.cpp 。
C++11 新增一個關鍵字 (keyword) nullptr 等同 NULL 的用法。
現在來改寫 on_pushButton_new_clicked() 函數,這也是點擊 New 按鈕後的動作,如下
034 | // 按下 New 按鈕的事件 |
035 | void EncryptWindow::on_pushButton_new_clicked() |
036 | { |
037 | e = new Encrypt(); |
038 | ui->label_display->setText(e->get_code_array()); |
039 | } |
這是實際用關鍵字 new 建立 Encrypt 資料成員 e ,然後在 label_display 顯示密碼表。
好了,按下左下方的執行鍵實際測試看看囉!
咦?沒有編譯成功,警告標誌停在
038 | ui->label_display->setText(e->get_code_array()); |
這裡編譯失敗,提示訊息告訴我們這裡不允許 string 轉換成 QString ,這是個型態不相符的問題,接下來我們要稍微停止開發的腳步,仔細討論一下這個問題說。
中英文術語對照
類別 | class |
專案 | project |
建構函數 | constructor |
型態 | type |
資料成員 | data member |
初值串列 | initializer list |
巨集 | macro |
指標 | pointer |
關鍵字 | keyword |
重點整理
- encrypt_gui 專案要使用 Encrypt ,就得加入 encrypt.h 與 encrypt.cpp 。
- EncryptWindow 整合 Encrypt 類別的方式為增加一個 Encrypt 型態的資料成員 e 。
- e 的初值設定為 NULL ,這是 C++ 中特定的巨集,表示什麼都沒有的指標。
- e 實際上在 on_pushButton_new_clicked() 建立,這是跟 New 按鈕連動的成員函數。
問題與討論
- 為什麼 EncryptWindow 中的資料成員 e 要宣告成指標?
- 為什麼 string 跟 QString 不能直接互相轉換?那 Qt 中的雙引號是字元陣列還是 QString ?
練習
- 承接上個單元的 guess_game 專案,整合單元 26 練習 exercise2601.h 的 GuessGame 類別,並在 GameWindow 類別中宣告 GuessGame 型態的資料成員 g 。
- 承上題,實作 New Game 按鈕,並在下方的 Text Browser 顯示遊戲開始的提示訊息。
the end
沒有留言:
張貼留言