从QML中调用函数的方法是什么?

4
我可以使用页面中的InvokeActionItem轻松共享项目,但我需要能够在listview项目中调用它。我已经成功触发了一个调用,但我无法弄清楚如何在触发时添加数据。我一直收到一个错误消息:

InvocationPrivate :: setQuery:您不被允许更改InvokeQuery对象

注意:我正在尝试纯粹使用QML完成此操作,如果必要,我将通过c ++完成,但QML是首选。

可在Page对象内运行的代码:

actions: [
    InvokeActionItem {
        ActionBar.placement: ActionBarPlacement.OnBar
        title: "Share"   
        query {
            mimeType: "text/plain"
            invokeActionId: "bb.action.SHARE"
        }

        onTriggered: {
            //myTextProperty is a string variable property for the page.
            data = myTextProperty;                
        }
    }
]

我尝试在另一个项目中使用的代码如下,但并没有起作用:

Container {
gestureHandlers: [
    TapHandler {
    LongPressHandler {
        onLongPressed: {
            console.log("Longpress");                

            invokeQuery.setData("test");

            invokeShare.trigger("bb.action.SHARE");
        }            
    }        

]

attachedObjects: [
    Invocation {
       id: invokeShare
       query: InvokeQuery {
           id:invokeQuery
           mimeType: "text/plain"         
       }   
    }
]
}

有没有一种纯粹使用QML更改调用数据的方法,还是我需要通过C++来运行它?

3个回答

11

在浏览了一些论坛并测试了各种方法后,我终于找到一个可行的方法。

将以下内容添加到您的attachedObjects中:

attachedObjects: [      
    Invocation {
       id: invokeShare
       query: InvokeQuery {
           id:invokeQuery
           mimeType: "text/plain"                        
       }
       onArmed: {
           if (invokeQuery.data != "") {
               trigger("bb.action.SHARE");
           }
       }             
    }
]

那么无论你需要在哪里调用该调用,都要执行以下操作:

invokeQuery.mimeType = "text/plain"
invokeQuery.data = "mytext";
invokeQuery.updateQuery();

请注意,如果您在onArmed函数中未对数据进行检查,则会在创建时自动调用invocation函数 - 在listview的情况下,这可能会导致出现20多个屏幕要求您在BBM上分享... ;)


对我很有帮助 - 感谢您的发布。这是在哪里记录的? - JeffAtStepUp
1
恐怕我不记得了,我在黑莓论坛上搜索了许多帖子,更别提博客之类的了,尝试了许多变化和选项,但都没有对我起作用,最终,在论坛帖子中找到了这个代码片段,但我没有将该页面加为书签。 - hyarion
我仍然在日志中收到“InvocationPrivate :: setQuery:您不被允许更改InvokeQuery对象”的消息,但一切正常。 - JeffAtStepUp

1

您实际上可以使用InvokeActionItem,只需调用updateQuery以重新触发invokeQuery。 当ListItemData更改时,绑定将导致值更新。

InvokeActionItem {
      enabled: recordItem.ListItem.data.videoId != undefined

      id: invokeAction
      query{ 
            uri: "http://www.youtube.com/watch?v=" + recordItem.ListItem.data.videoId
            onQueryChanged: {
                  updateQuery()
            }
      }

}

谢谢,这非常有用!在发布原始问题时,bb10的qml功能要有限得多,您的解决方案可能无法奏效。 - hyarion

1

为了消除“InvocationPrivate :: setQuery:您不允许更改InvokeQuery对象”的消息,我使用了以下代码:

attachedObjects: [      
    Invocation {
        id: invoke
        query {
            mimeType: "text/plain"
            invokeTargetId: "sys.bbm.sharehandler"
            onDataChanged: {
                console.log("change data")
            }                   
        }
        onArmed: {
            if (invoke.query.data != "") {
                invoke.trigger("bb.action.SHARE");
            }
        } 
    }
]

function shareBBM(){
    invoke.query.setData("TEXT TO SHARE");
    invoke.query.updateQuery();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接