从QML函数调用?(Invocation from function in QML?)

2019-08-06 22:57发布

我可以分享一个项目容易使用页面的InvokeActionItem但我需要能够调用它在ListView项目。 我已经成功地触发调用,但我无法弄清楚如何触发时添加数据。 我不断收到一条错误消息

InvocationPrivate :: setQuery:你不能改变InvokeQuery对象

注:我想这样做纯粹QML,我会通过C做++如果有必要,但QML将是可取的。

一个页面对象内部运行的代码:

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 ++它代替?

Answer 1:

相当数量的浏览论坛和测试各种方法后,我终于找到一个工程。

添加下面你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它会自动调用创建时的调用 - 在ListView的情况下,这可能会导致20+屏幕要求您对BBM共享...;)



Answer 2:

实际上,你可以使用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()
            }
      }

}


Answer 3:

对于删除“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();
}


文章来源: Invocation from function in QML?