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 上下文菜单从按钮单击