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_INVOKABLE
与 QMetaObject::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;
…
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: python 异常处理
下一篇: MyBatis 介绍和使用
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论