4

我可以使用页面中的 InvokeActionItem 轻松共享项目,但我需要能够在列表视图项目中调用它。我已经成功触发了一个调用,但我不知道在触发它时如何添加数据。我不断收到一条错误消息

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++ 运行它?

4

3 回答 3

11

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

在您的附加对象中添加以下内容:

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 中的数据,它将自动调用创建时的调用 - 在列表视图的情况下,这可能会导致 20 多个屏幕要求您在 bbm 上共享...;)

于 2013-01-16T16:08:30.253 回答
1

对于删除“InvocationPrivate::setQuery: you are not allowed to change InvokeQuery object”消息我使用这个:

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();
}
于 2014-04-21T16:23:31.990 回答
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()
            }
      }

}
于 2013-10-09T02:42:04.747 回答