【问题标题】:Modifying a QVariantMap with JavaScript使用 JavaScript 修改 QVariantMap
【发布时间】:2011-06-03 17:02:32
【问题描述】:

QtWebKit Bridge 文档声明如下 -

复合 (JSON) 对象 JavaScript 复合对象,也称为 JSON 对象,是持有一个 键值对列表,其中所有 键是字符串,值可以 有任何类型。这翻译得很 对 QVariantMap 来说很好,这没什么 不仅仅是一个 QString 的 QMap QVariant。无缝转换 JSON对象和QVariantMap之间 允许一种非常方便的方式 传递任意结构化数据 在 C++ 和 JavaScript 之间 环境。原生 QObject 必须 确保复合值是 转换为 QVariantMaps 和 QVariantLists 和 JavaScript 是 保证收到他们在 有意义的方式。请注意,类型 JSON不支持,比如 JavaScript 函数和 getter/setter,不会被转换。

这是否意味着,虽然 JavaScript 能够读取 QVariantList,但无法对其进行修改?

我已经尝试添加一个 getter 和 setter 用于测试目的 -

Q_PROPERTY( QVariantMap Settings READ GetShadowSettings WRITE SetShadowSettings )

当 JavaScript 想要访问来自 QVariantMap 的任何数据时,将调用 getter 函数。不幸的是,当 JavaScript 尝试更新 QVariantMap 时,会再次调用 getter 函数(而不是 setter 函数)。

我可以使用简单的辅助函数来修改数据,例如 -

Q_INVOKABLE void Update( QString key, QVariant value ) {
    settings[key] = value;
}

我只是想知道是否有一种方法可以在不需要辅助函数的情况下做到这一点?

【问题讨论】:

    标签: qt qtwebkit


    【解决方案1】:

    我将QVariantMap 用于 PhantomJS,它工作得很好。例如,WebPage#viewportSize 只是其实现中的 QVariantMap。通常的问题是您不能尝试仅更新其属性之一,例如viewportSize.width = 300。你必须传回一个对象,例如:

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

    如果您需要能够做到前者,唯一可行的(丑陋的)解决方法是创建一个辅助对象,例如Size 在上面的情况下,它有适当的设置器和获取器用于单个属性并处理桥接的内务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2012-12-12
      • 2021-06-22
      • 2011-06-11
      相关资源
      最近更新 更多