Q_INVOKABLE与invokeMethod用法全解

Posted maxiongying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Q_INVOKABLE与invokeMethod用法全解相关的知识,希望对你有一定的参考价值。

Q_INVOKABLE与invokeMethod用法全解

请尊重原创作品和译文。转载请保持文章完整性,并以超链接形式注明原始作者地址http://blog.csdn.net/changsheng230,方便其他朋友提问和指正。

 

Qt Quick宏浅议一文中,我们将介绍const char * member,

  • QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( 0 ), …)  
  •  

     

    invokeMethod 的用法为,尝试调用对象obj的方法member(注意member可以为信号或者是槽),如何member可以被调用,则返回真,否则返回假。 QMetaObject::invokeMethod可以是异步调用,也可以是同步调用。这取决与它的连接方式Qt::DirectConnection,则为同步调用,若为"methodName",   

  • Q_ARG(type1, arg1),   
  • Q_ARG(type2, arg2));  
  •  

    上述调用为异步调用。请注意,因为上面所示的参数需要被在构建事件时进行硬拷贝,参数的自定义型别所对应的类需要提供一个共有的构造函数、析构函数以及拷贝构造函数。而且必须使用注册Qt C++/QML混合编程,跨线程编程Qt/ HTML5混合编程以及里广泛使用。

    Qt元对象系统。考虑在QML中使用Qt 4.7   
  • import Shapes 5.0   //自定义模块  
  • Item {   
  •     width: 300; height: 200  
  •     Ellipse {   
  •          x: 50; y: 35; width: 200; height: 100   
  •         color: "blue"   
  •          MouseArea {   
  •             anchors.fill: parent  
  •             // 调用C++中定义的randomColor方法   
  •             onClicked: parent.color = parent.randomColor()    
  •         }   
  •     }  
  • }  
  •  

    为了让上述QML代码成功的调用下面这段代码定义的randomColor()函数,最为关键的一点见randomColor方法用Q_INVOKABLE 修饰。

    1. #include <QDeclarativeItem >  
    2. class EllipseItem : public QDeclarativeItem   
    3. {   
    4.     Q_OBJECT   
    5. public:  
    6.       Q_INVOKABLE QColor randomColor() const;  
    7.       …  
    8. }  
     

    更多细节,请参看我的另一篇博文:QML与C++混合编程使用

    在跨线程编程中的使用

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

    Qt服务框架是methodQ_INVOKEBLE来实现

     

    其中,最常见的与servicer交互的方法如下:

    1. QServiceManager manager;QObject *storage ;  
    2. storage = manager.loadInterface("com.nokia.if (storage)     QMetaObject::invokeMethod(storage, "deleteFile", Q_ARG(QString, "/tmp/readme.txt"));  
    上面的代码通过service的元对象提供的invokeMethod方法,调用文件存储对象的deleteFile() 方法。客户端不需要知道对象的类型,因此也没有链接到具体的service库。  当然在服务端的deleteFile方法,一定要被标记为Q_INVOKEBLE,才能够被元对象系统识别

    method和property来通信,就像本地对象一样。服务可以设定为在客户端间共享,或针对一个客户端。  请注意,在method仅支持跨线程。 下图是跨进成的服务/客户段通信示意图(图片来自诺基亚论坛)。这里我们可以清楚的看到,invokable 技术分享

    有关Qt Service Framework文档

 

以上是关于Q_INVOKABLE与invokeMethod用法全解的主要内容,如果未能解决你的问题,请参考以下文章

Q_INVOKABLE与invokeMethod用法全解

GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )

GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )

GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 )

Q_INVOKABLE 是不是需要在 Qt5 中从 QML 调用公共 QObject 函数?

GroovyMOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )