Qt
Qt C++ 基礎知識
核心概念
-
信號與槽 (Signal & Slot):Qt 的事件處理機制
// 範例:按鈕點擊觸發函式 connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
-
物件樹 (Object Tree):自動記憶體管理
// 父物件會自動刪除子物件 QWidget* parent = new QWidget(); QLabel* child = new QLabel(parent); // parent 會管理 child 的記憶體
-
元物件系統 (Meta-Object System):支援反射和動態屬性
Q_OBJECT // 啟用元物件系統
Qt 特有的 C++ 擴展
- Q_OBJECT 巨集:啟用信號槽系統
- slots/signals 關鍵字:定義槽函式和信號
- emit 關鍵字:發送信號
- MOC (Meta-Object Compiler):Qt 的前處理
Qt 常見錯誤模式
-
信號槽連接錯誤
// ❌ 錯誤:忘記檢查連接結果 connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked); // ✅ 正確:總是檢查連接結果 bool success = connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked); Q_ASSERT(success); // Debug 模式下會觸發斷言 // 或使用更詳細的錯誤處理 if (!connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked)) { qFatal("無法連接按鈕信號"); }
-
記憶體洩漏
// ❌ 錯誤:忘記設定父物件 QLabel* label = new QLabel("Hello"); // 沒有父物件,需要手動刪除 // ✅ 正確:設定父物件 QLabel* label = new QLabel("Hello", this); // this 會自動管理記憶體
-
執行緒違規
// ❌ 錯誤:在工作執行緒中直接更新 UI void WorkerThread::run() { // 這會導致崩潰! mainWindow->updateStatus("處理中..."); } // ✅ 正確:使用信號槽機制 void WorkerThread::run() { emit statusChanged("處理中..."); // 信號會在正確的執行緒中處理 }
設定開發環境
Qt + Cmake + vscode + mac
安裝開發環境
- Qt (CMake)
- Xcode
- Visual Studio Code
安裝VS Code擴充套件
- Qt extension pack
- C/C++擴充套件
- CMake
- CMake Tools
Qt + Cmake + vscode + win
安裝開發環境
- Qt (CMake)
- Visual Studio(使用C++的桌面開發)
- Visual Studio Code
安裝VS Code擴充套件
- Qt extension pack
- C/C++擴充套件
- CMake
- CMake Tools
設定 vcpkg
-
要設定安裝 vcpkg 的目錄路徑,請選擇偏好設定 > CMake > Vcpkg。
-
設定
CMAKE_TOOLCHAIN_FILE
為使用 vcpkg 工具鏈(vcpkg-root/scripts/buildsystems/vcpkg.cmake
),vcpkg 會利用工具鏈檔案機制來插入程式碼,從而內建 CMake 函式整合。