我想确定在调用另一个线程中的QObject槽或Q_INVOKABLE方法时,从QML调用是否能够正常工作,以及是否安全。
假设有一个主线程和ThreadA。QObjectA位于ThreadA中。QML引擎/ GUI / 所有内容都位于主线程中。我使用某种方式将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 的信号和槽一样。
我想知道Qt的qml引擎是否自动选择了正确的类型来从QML跨线程调用C++方法,如果是,从QML调用其他线程中的对象的方法是否是可以接受的做法。
qDebug() << "Main thread: " << QThread::currentThreadId();
来确定函数的运行位置。正如其他评论所述,不应假设某些未记录的行为将在将来的版本中保持一致。 - mozzbozz