| 特性 | MFC (VC++) | Qt |
| 模型 | 訊息泵 + 視窗程序 + 訊息映射 | Signal/Slot (觀察者模式) |
| 連接方式 | 發送者 Post/SendMessage 給接收者 HWND | 集中管理:connect(sender, SIGNAL(), receiver, SLOT()) |
| 耦合度 | 發送者需知接收者存在 (HWND) | 完全解耦,雙方互不知曉 |
| 型別安全 | WPARAM/LPARAM 無型別,靠約定 | 編譯期型別檢查 (moc) |
2. 含自定義 Signal/Slot 類別的必要結構
class MyClass : public QObject {
Q_OBJECT // 必須宏,啟用 moc 元物件編譯器
public slots: // 定義槽函數
void onDataReady(const QString&);
signals: // 定義信號
void dataChanged(int);
};
moc 會生成額外 C++ 檔案實現信號/槽調度,建置系統需支援 (qmake/CMake 自動處理)。
3. 前向宣告加速編譯
若 .h 僅使用指標/引用,僅需前向宣告:
// MyClass.h
class OtherClass; // 僅宣告
class MyClass {
OtherClass* m_pOther; // 指標/引用 OK
};
#include "OtherClass.h" 移至 .cpp,大幅減少頭文件依賴鏈,提升增量編譯速度。MFC 同樣適用但較少強調。
4. 頭文件防重複包含護衛
#ifndef MYCLASS_H
#define MYCLASS_H
// ... 類別定義 ...
#endif
或現代 C++ 推薦 #pragma once (MSVC/GCC/Clang 均支援),更簡潔無宏名衝突風險。
總結
- MFC:訊息導向、緊耦合 HWND、單一繼承、文檔/視圖架構
- Qt:信號/槽、鬆耦合、多重繼承 (QObject)、模型/視圖/代理、跨平台
- 遷移核心在於思維轉換:「發送訊息給誰」 → 「發射信號,誰連接誰負責」
- 上一篇文章: VC 手動新增自定義訊息完整流程:從定義到 ClassWizard 識別
- 下一篇文章: VC 專案引入 LIB 靜態庫的三種方法與 Debug/Release 版本自動切換技巧
Copyright ©
程式碼之家 All Rights Reserved