QML 图像不会在图像源中加载具有非 ASCII 字符的图像

Posted

技术标签:

【中文标题】QML 图像不会在图像源中加载具有非 ASCII 字符的图像【英文标题】:QML image does not load image with non ASCII character in image source 【发布时间】:2018-04-16 09:51:17 【问题描述】:

我必须在基于 Linux 的设备上显示来自 USB 设备的图像。 我的 USB 有一个包含非 ASCII 字符的文件夹。 替换为“?”字符。

原始路径:"file:///tmp/USB6/§§§§/Koala.jpg"

QML 返回错误:"QML Image: Cannot open: file:///tmp/USB6/????/Koala.jpg"

我的图片将如何使用此路径加载?

Image 
  id: mainImage
  source: iconRole
  asynchronous: true
  sourceSize.width:  screenSize_Width
  sourceSize.height:  screenSize_Height
  fillMode: Image.PreserveAspectCrop
  onSourceChanged: 
     console.log("SOURCE = ",source)
  

    我得到的日志:SOURCE = file:///tmp/USB6/§§§§/Koala.jpg 我获取 QML 图像时出错:Cannot open: file:///tmp/USB6/????/Koala.jpg

【问题讨论】:

我知道你怀疑这个角色,这可能是原因,但是你也提到了 USB,你有权限打开那里的文件吗? 是的,所有权限都在那里。包含 ASCII 字符的文件路径可以正确打开。 我明白了,你能分享你打开文件的那部分代码吗? 如果您将图像绑定为资源(在 qrc 中),您会得到什么。 确保使用正确的文件名编码挂载 usb 文件系统,qml 源是 UTF-8 编码的,并且系统区域设置与之匹配。在开始使用 QML 之前,您应该有时间使用 QFile 正确打开。 【参考方案1】:

关于 URL 的 Qt 文档:

此外,URL 可能包含使用 RFC 3986 指定的“百分比编码”方案。这些字符将 保存在 url 类型的属性中,以允许 QML 代码 构造精确的 URL 值。该规则的一个例外是 目录分隔符('/')的抢先式解码 - 这些 字符被解码以允许正确分类 URL。

例如,包含“#”字符的本地文件,它会 通常被解释为 URL 'fragment' 的开头 元素,可以通过对文件名的字符进行编码来访问:

Image  source: encodeURIComponent("/tmp/test#1.png") 

这种基本类型是由 QML 语言提供的。

【讨论】:

是否需要为系统设置任何区域设置? @AnupamSrivastava 是的,我猜你不能,因为它只提到了 ascii 符号,我认为 Qt/QML 不支持你想做的事情。我知道您可以使用 Python 使用宽字符来做到这一点,但我认为这在 Qt 中是不可能的。【参考方案2】:

它适用于这种情况。

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

把这条语句放在main.cpp中

【讨论】:

以上是关于QML 图像不会在图像源中加载具有非 ASCII 字符的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时生成的 QML 中加载图像(jpg)

使用 QQuickImageProvider 在 QML WebEngineView 中加载图像

图像不会在 Xcode iOS 模拟器中加载

如果在 JSON 对象中加载空图像 URL,则应用程序崩溃

按下鼠标时不会更新 QML 图像源

Qml 图像不会在源更改和信号接收时刷新