我正在尝试确定如何从 QML 调用 QObject 插槽或 Q_INVOKABLE 方法来为存在于另一个线程中的 QObject 工作,以及这样做是否安全。
假设有一个 MainThread 和 ThreadA。QObjectA 位于 ThreadA 中。QML 引擎/gui/一切都存在于 MainThread 中。我使用 QObjectA 将 QObjectA 暴露给 QML 引擎
declarativeView->setContextProperty("someObj",ObjectA)
现在在 QML 文件中,我调用
someObj.someMethod();
其中 someMethod 是一个插槽或者是 Q_INVOKABLE。我想知道哪个线程实际执行该函数。如果是 MainThread,那将是一件坏事,跨线程调用这样的方法会很危险。但是,如果它由 ThreadA 执行,一切都会好起来的。
基于此文档:http ://doc.qt.nokia.com/4.7-snapshot/qtbinding.html,我假设 QMetaObject::invokeMethod() 用于调用 QObject 函数。该文档(http://doc.qt.nokia.com/4.7-snapshot/qmetaobject.html#invokeMethod)表明有不同的连接类型可用,就像 Qt 信号和插槽一样。
我想知道在跨线程从 QML 调用 C++ 方法时,Qt 的 qml 引擎是否会自动选择正确的类型,如果是这样,从 QML 调用存在于其他线程中的对象的方法是一种可接受的做法。