【问题标题】:Passing state between screens in a Symbian/QML app在 Symbian/QML 应用程序中的屏幕之间传递状态
【发布时间】:2011-01-31 11:00:29
【问题描述】:

我正在尝试使用Loader 来加载全屏组件以在 Symbian/QML 项目中更改屏幕。感觉这不是正确的方法,所以我可能遗漏了一些明显的东西。

我将使用的示例是一个屏幕上的按钮,它应该打开一个全屏 WebView(a.k.a ChildBrowser)。我想让 ChildBrowser 成为一个可重用的组件,所以需要将 URL 传递给它。

我尝试使用 pragma library 构建一个 Javascript 文件:

.pragma library
var map = {};
function put(key, value) {
      map[key] = value;
}
function get(key) {
      return map[key];
}

如果需要更好的标题,我们称之为intent.js

按住按钮的屏幕:

import "intent.js" as Intent

Button {
    onButtonClicked: {
        Intent.put("url", "http://example.com");
        console.log("Going to " + Intent.get("url"));
    }
}

稍后,在ChildBrowser.qml 中,我将导入“intent.js”,然后获取 Intent.get(“url”)。这是undefined

我的问题是:

  • 是否使用Loader 在屏幕之间构建和转换的预期方式?
  • 如何在屏幕之间传递参数?
  • 如何在应用程序的整个生命周期内维护状态?我对用 Javascript 构建控制器和模型特别感兴趣。

我确定这些都是新手问题,因此可能只需要一组相关文档的链接;我怀疑不是

【问题讨论】:

    标签: qt4 symbian maemo qml


    【解决方案1】:

    Loader 是避免在需要之前创建项目的好方法。

    假设 ChildBrowser 有一个“url”属性,你可以这样做:

    Button {
        onButtonClicked: browser.load("http://example.com")
    }
    Loader {
        id: browser
        property string url
        function load(u) {
            url = u
            if (status == Loader.Null)
                source = "ChildBrowser.qml"
            else if (status == Loader.Ready)
                item.url = url
        }
        onLoaded: item.url = url
    }
    

    向您的 ChildBrowser 添加“url”属性只是在根项目上拥有一个属性的问题,例如

    Rectangle {
        property alias url: webview.url
    
        WebView {
            id: webview
        }
    }
    

    【讨论】:

    • 加载程序仍然必须在调用站点有一些样板。不过,这给了我一些想法。谢谢。
    • 如果您知道加载的 qml 文件将无法通过网络访问,您可以在此处使用快捷方式。如果 qml 文件来自本地文件系统或资源文件,则设置 Loader 源是同步的。有了这个假设,您可以将属性保存在加载程序、onLoaded 处理程序和 else if 上。
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2019-01-22
    • 2023-03-18
    • 2019-11-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多