QML 擅長聲明式 UI 構建,C++ 擅長業務邏輯與高性能計算。結合兩者:QML 做界面,C++ 做核心,通過 Qt 元對象系統實現無縫交互。
| 方式 | 特點 |
|---|---|
註冊類型 qmlRegisterType | C++ 類在 QML 中成爲可實例化類型,支持屬性、信號、槽、枚舉、構造函數 |
上下文屬性 setContextProperty | 將 C++ 對象實例直接暴露給 QML,無法作為類型使用(如屬性類型、參數類型) |
QObject 或其子類Q_OBJECT 宏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_INVOKABLEQ_INVOKABLE void stop() { ... }
// QML: gemini.stop()
Q_PROPERTYQ_PROPERTY(int ballNumber READ ballNumber WRITE setBallNumber NOTIFY ballNumberChanged) // QML 可讀寫 gemini.ballNumber,自動觸發 onBallNumberChanged
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 訪問
QObject 類中qmlRegisterType,需要單例或全局訪問時用 setContextPropertyQVariant 支持的類型)onXxx 形式(首字母大寫)Qt 的元對象系統是 QML/C++ 交互的基石,理解 Q_OBJECT、Q_PROPERTY、Q_INVOKABLE、Q_ENUMS 四大宏的作用,即可靈活構建混合應用。