首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

QML 與 C++ 混合編程詳解:雙向交互完整指南

     編輯:關於C++

為什麼混合編程

QML 擅長聲明式 UI 構建,C++ 擅長業務邏輯與高性能計算。結合兩者:QML 做界面,C++ 做核心,通過 Qt 元對象系統實現無縫交互。

QML 訪問 C++ 兩大途徑

方式特點
註冊類型 qmlRegisterTypeC++ 類在 QML 中成爲可實例化類型,支持屬性、信號、槽、枚舉、構造函數
上下文屬性 setContextProperty將 C++ 對象實例直接暴露給 QML,無法作為類型使用(如屬性類型、參數類型)

C++ 類被 QML 訪問的條件

  1. 繼承 QObject 或其子類
  2. 類定義中包含 Q_OBJECT 宏
  3. 成員為 public 或 protected

核心機制詳解

信號與槽

// C++
class Gemini : public QObject {
    Q_OBJECT
signals: void begin();
public slots: void doSomething() { qDebug() << "called"; }
};
// main.cpp
qmlRegisterType("Union.Lotto.Gemini", 1, 0, "Gemini");
// QML
Gemini { id: gemini; onBegin: doSomething() }
MouseArea { onClicked: gemini.begin() }

枚舉類型

class Gemini : public QObject {
    Q_OBJECT
    Q_ENUMS(BALL_COLOR)
public:
    enum BALL_COLOR { YELLOW, RED, BLUE };
};
// QML: Gemini.RED

可調用函數 Q_INVOKABLE

Q_INVOKABLE void stop() { ... }
// QML: gemini.stop()

屬性系統 Q_PROPERTY

Q_PROPERTY(int ballNumber READ ballNumber WRITE setBallNumber NOTIFY ballNumberChanged)
// QML 可讀寫 gemini.ballNumber,自動觸發 onBallNumberChanged

C++ 訪問 QML

  • 屬性:obj->property("width") / obj->setProperty("color", "red")
  • 查找子對象:obj->findChild<QObject*>("objectName")
  • 調用函數:QMetaObject::invokeMethod(obj, "func", Q_RETURN_ARG(...), Q_ARG(...))
  • 連接信號:QObject::connect(obj, SIGNAL(qmlSig(QString)), &cppObj, SLOT(cppSlot(QString)))

完整交互示例架構

// main.cpp
QGuiApplication app(argc, argv);
qmlRegisterType("Lib", 1, 0, "Gemini");
QQmlApplicationEngine engine;
engine.load(QUrl("qrc:/main.qml"));
// 或使用 QQuickView 獲取 rootObject 進行 C++→QML 訪問

最佳實踐建議

  1. UI 邏輯留在 QML,業務邏輯封裝在 C++ QObject 類中
  2. 優先用 qmlRegisterType,需要單例或全局訪問時用 setContextProperty
  3. 跨語言調用參數類型需符合 Qt 類型系統(自動轉換 QVariant 支持的類型)
  4. 信號名在 QML 中轉為 onXxx 形式(首字母大寫)

Qt 的元對象系統是 QML/C++ 交互的基石,理解 Q_OBJECT、Q_PROPERTY、Q_INVOKABLE、Q_ENUMS 四大宏的作用,即可靈活構建混合應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved