BlackBerry Cascades 中的 QML 字符串

Posted

技术标签:

【中文标题】BlackBerry Cascades 中的 QML 字符串【英文标题】:QML Strings in BlackBerry Cascades 【发布时间】:2012-11-21 20:37:25 【问题描述】:

我正在尝试在最新的 BlackBerry 10 平台上构建自定义按钮。

按钮应在单击时更改背景图像,然后在第二次单击时将其更改回来

按钮逻辑相当简单:一旦点击,我检查按钮中当前图像的类型并更改图像源。

我从一个基本的 QML 自定义控件开始,它看起来像这样(去掉了标签和其他不重要的东西):

import bb.cascades 1.0

Container


    id: root
    layout: DockLayout
    
    

    function clickMe()
    
        var source = myImage.defaultImageSource.toString();

        console.log(source);

        if (source.endsWith("image.png"))
        
            myImage.defaultImageSource = "asset:///images/image_pushed.png";
        
        else
        
            myImage.defaultImageSource = "asset:///images/image.png";
        
    

    ImageButton
    
        id: myImage
        defaultImageSource: "asset:///images/image.png"
    

    onCreationCompleted: 
    
        myImage.clicked.connect(root.clickMe);
    

ImageButton 点击​​事件连接到 javascript 函数 clickMe。函数触发并且 URL 被正确记录到控制台。

问题在于 IF 子句,因为 image_pushed.png 从未设置。为什么会出现这个问题,我该如何实现这个按钮?

我正在寻找针对此问题的仅 QML 解决方案,我找到了以下信息:

defaultImageSource 属性是 QUrl 类型,它确实包含 toString() 方法。 toString()方法返回QString,确实有endsWith函数。 我的 QML 参考:http://qt-project.org/doc/qt-4.8/qstring.html#endsWith

谢谢。

【问题讨论】:

【参考方案1】:

在 QML 中,QString 实例似乎是一个普通的 JavaScript 字符串。此映射是自动完成的。并且 Javascript 字符串没有 endsWith 方法。您可以使用带有正则表达式的search 方法来实现相同的目的。

if (source.search(/image\.png$/ !== -1)  /* ... */ 

【讨论】:

如果 QML QString 实例被转换为 JS 字符串,这就解释了为什么 endsWith 方法不存在。但是 JS 字符串确实有 Substring 和 Substr 方法,在这种情况下也不起作用(这是我第一次尝试解决这个问题)。 您提到的方法以小写字母开头。您还可以通过检查console.log(typeof(source)) 的输出来确定这一点。如果它说“字符串”,它实际上是一个 JS 字符串。 我必须说我经历了更多的测试,我实际上是按照您的概念进行的。谢谢,你是对的,使用的是JS字符串,不是QString。【参考方案2】:

我认为您可以使用属性创建更简单的方法

例如:

Control
 id : myControl
 property bool state
 ImageButton
  defaultImageSource : state ? "firstImageAsset.png" : "secondImageAsset.png"
  onClick :
    myControl.state = !myControl.state
   
 

【讨论】:

这就是我已经实现按钮的方式。但我还是想知道,为什么提出的方法不起作用? 是的,我觉得就像@sebasgo 说的,javascript 字符串没有像Java 那样的endsWith 方法 就像我对另一个答案的评论:我尝试使用 JavaScript 字符串进行尝试,但 substring 和 substr 方法也不起作用。

以上是关于BlackBerry Cascades 中的 QML 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?

尝试在 Blackberry Cascades QT 和 QML 中下载图像

BlackBerry Cascades:如何将数据加载到 ListView

Blackberry Cascades 上下文菜单从按钮单击

我的 Blackberry 10 Cascades(C++、Qt 和 QML)示例应用程序在启动时崩溃并出现以下错误

BlackBerry Cascades 10 Maps 示例一直显示黑屏