Qt Q_INVOKABLE 与 invokeMethod 用法全解

发布于 2024-08-04 17:57:20 字数 1601 浏览 29 评论 0

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;  
    …  
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

花辞树

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文