invokeMethod and Q INVOKABLE method - KerwinKoo/KerwinKoo.github.io GitHub Wiki

Qt Q_INVOKABLE与invokeMethod用法全解

invokeMethod

invokeMethod的用法为,尝试调用对象obj的方法member(注意member可以为信号或者是槽),如何member可以被调用,则返回真,否则返回假。

QMetaObject::invokeMethod可以是异步调用,也可以是同步调用。这取决与它的连接方式Qt::ConnectionType type。如果type为Qt::DirectConnection,则为同步调用,若为Qt::QueuedConnection,则为异步调用。

例如:

QMetaObject::invokeMethod(object, "methodName",   
Qt::QueuedConnection,   
Q_ARG(type1, arg1),   
Q_ARG(type2, arg2));  

QMetaObject::invokeMethod(object, "methodName", Qt::QueuedConnection, Q_ARG(type1, arg1), Q_ARG(type2, arg2));  

上述调用为异步调用。请注意,因为上面所示的参数需要被在构建事件时进行硬拷贝,参数的自定义型别所对应的类需要提供一个共有的构造函数、析构函数以及拷贝构造函数。而且必须使用注册Qt型别系统所提供的qRegisterMetaType() 方法来注册这一自定义型别。

Q_INVOKABLE

Q_INVOKABLEQMetaObject::invokeMethod均由元对象系统唤起。这一机制在Qt C++/QML混合编程,跨线程编程,Qt Service Framework 以及 Qt/ HTML5混合编程以及里广泛使用。

我们如何调用驻足在其他线程里的QObject方法呢?

Qt提供了一种非常友好而且干净的解决方案:向事件队列post一个事件,事件的处理将以调用我们所感兴趣的方法为主(当然这需要线程有一个正在运行的事件循环)。而触发机制的实现是由moc提供的内省方法实现的。

因此,只有信号、槽以及被标记成Q_INVOKABLE的方法才能够被其它线程所触发调用。如果你不想通过跨线程的信号、槽这一方法来实现调用驻足在其他线程里的QObject方法。另一选择就是将方法声明为Q_INVOKABLE,并且在另一线程中用invokeMethod唤起。

因此,在QML与C++混合编程中,QML代码成功的调用下面这段代码定义的randomColor()函数,最为关键的一点见randomColor方法用Q_INVOKABLE 修饰。

#include <QDeclarativeItem >  
class EllipseItem : public QDeclarativeItem   
{   
    Q_OBJECT   
public:  
      Q_INVOKABLE QColor randomColor() const;  
      …  
}  
⚠️ **GitHub.com Fallback** ⚠️