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 修飾。
- #include <QDeclarativeItem >
- class EllipseItem : public QDeclarativeItem
- {
- Q_OBJECT
- public:
- Q_INVOKABLE QColor randomColor() const;
- …
- }
更多細節,請參看我的另一篇博文:QML與C++混合編程使用
在跨線程編程中的使用
我們如何調用駐足在其他線程里的QObject方法呢?事件循環與線程
Qt服務框架是method和Q_INVOKEBLE來實現
其中,最常見的與servicer交互的方法如下:
- QServiceManager manager;QObject *storage ;
- 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文檔