开发者

Modifying a QVariantMap with JavaScript

The QtWebKit Bridge documentation states the following -

Compound (JSON) objects JavaScript compound objects, also known as JSON objects, are variables that hold a list of key-value pairs, where all the keys are strings and the values can have any type. This translates very well to QVariantMap, which is nothing more than a QMap of QString to QVariant. The seamless conversion between JSON objects and QVariantMap allows for a very convenient way of passing arbitrary structured data between C++ and the JavaScript environment. The native QObject has to make sure that compound values are converted to QVariantMaps and QVariantLists, and JavaScript is guaranteed to receive them in a meaningful way. Note that types that are not supported by JSON, such as JavaScript functions and getters/setters, are not converted.

Does this mean that, while JavaScript is able to read a QVariantList, it is unable to modify it?

I've tried adding a getter and setter for test purposes -

Q_PROPERTY( QVariantMap Settings READ GetShadowSettings WRITE SetShadowSettings )

The getter function is being called when the JavaScript wants to access any data from the QVariantMap. Unfortunately, when the JavaScript attempts to update the QVariantMap, the getter function is called again (rather than the setter function).

I can modify the data using a simple helper function such as -

Q_INVOKABLE void Update( QString key, QVariant val开发者_运维百科ue ) {
    settings[key] = value;
}

I was just wondering if there was a way of doing this without the need for a helper function?


I use QVariantMap for PhantomJS and it works just fine. For example, WebPage#viewportSize is just QVariantMap in its implementation. The usual problem is you can't try to update one of its property only, e.g. viewportSize.width = 300. You have to pass back an object, e.g.:

viewportSize = { width: 300, height: 200 }.

If you need to able to do the former, the only (ugly) workaround that might work is to create a helper object, e.g. Size in the above case, which has the proper setter and getter for the individual property and handle the housekeeping of bridging.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜