函数申明 Q_INVOKABLE
函数申明 Q_INVOKABLE
Q_INVOKABLE 是 Qt 提供的一个宏,主要用于 使成员函数能够被 Qt 的元对象系统(Meta-Object System)识别和调用。它通常用于让成员函数:
-
能够被 Qt 的 QMetaObject::invokeMethod() 调用;
-
能够被 Qt QML 引擎识别(如果你在用 QML);
-
可以跨线程使用信号/槽机制以外的方式调用。
✅ 使用场景
假设你有一个类定义如下:
class MyObject : public QObject {Q_OBJECTpublic:MyObject(QObject* parent = nullptr) : QObject(parent) {}Q_INVOKABLE void sayHello(); // 加了 Q_INVOKABLEvoid notInvokable(); // 没加
};
📌 特点解析
- 被 QMetaObject::invokeMethod() 调用
只有使用了 Q_INVOKABLE 修饰的函数,才能被 invokeMethod() 调用:
MyObject obj;
QMetaObject::invokeMethod(&obj, "sayHello"); // ✅ OK
QMetaObject::invokeMethod(&obj, "notInvokable"); // ❌ 不可行
- 可以在 QML 中调用
当你将 C++ 类注册到 QML 中时,只有 Q_INVOKABLE 或 public slots 的函数能在 QML 脚本中被直接调用:
MyObject {Component.onCompleted: sayHello() // ✅ 可以用
}
- 不影响成员函数的调用方式
你仍然可以在 C++ 中直接调用它;
Q_INVOKABLE 只是告诉 Qt 元对象系统:“我想让这个函数能被反射式调用”。
✅ 总结一句话:
Q_INVOKABLE 是让一个普通成员函数进入 Qt 的“反射系统”,你可以通过字符串名字动态调用它,它在跨线程、QML 调用、脚本式引擎中非常有用。