D.N.

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 常見錯誤模式

  1. 信號槽連接錯誤

    // ❌ 錯誤:忘記檢查連接結果
    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("無法連接按鈕信號");
    }
    
  2. 記憶體洩漏

    // ❌ 錯誤:忘記設定父物件
    QLabel* label = new QLabel("Hello");  // 沒有父物件,需要手動刪除
    
    // ✅ 正確:設定父物件
    QLabel* label = new QLabel("Hello", this);  // this 會自動管理記憶體
    
  3. 執行緒違規

    // ❌ 錯誤:在工作執行緒中直接更新 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

  1. 要設定安裝 vcpkg 的目錄路徑,請選擇偏好設定 > CMake > Vcpkg

  2. 設定 CMAKE_TOOLCHAIN_FILE 為使用 vcpkg 工具鏈(vcpkg-root/scripts/buildsystems/vcpkg.cmake),vcpkg 會利用工具鏈檔案機制來插入程式碼,從而內建 CMake 函式整合。

Qt 相關模組

Qt Installer Framework

© 2024 D.N.. All rights reserved.