QML Image获取资源路径的细节

ML是门相当新的UI描述语言,因此在文档上总难免有疏漏之处,如果因此产生了bug,则就需要花费大量的时间去排查。

在最近笔者使用QML的过程中,在Image获取资源路径的细节上就出现了这样的情况。

Image 是qml中一个非常普通的元素,通常使用方法如下:

Image {  width: 120; height: 120  fillMode: Image.TileHorizontally  smooth: true  source: "qtlogo.png"  }

其中,source指的Image元素获取资源的url路径,这个url可以是本地的绝对路径或者相对路径,也可以是qt资源系统的路径,甚至是网络资源的路径。

正是这个看起来不起眼的路径,却会带来跟预期想之外的结果,并且,仅仅从代码上来看,没有半点错误的地方。

要了解这种情况的出现,应该要知道qml的两种使用方式:

1.暴露QML源码的使用方法,即不对QML文件进行处理,存放在可执行文件的目录下,使用QtDeclarative模块动态载入,一般适合以开源程序;

2.混淆QML源码的使用方法,即将QML文件加入到qt资源系统,编译成二进制文件供QtDeclarative模块使用,这样的好处,是可以隐藏代码,供商业项目使用。

在前种的使用方式中,Image元素对于读取资源路径正确无误,在Mac.OS.X,Ubuntu和windows平台上表示一致,但是后者,却出现了不同。

假设Image以如下代码使用:

QML是门相当新的UI描述语言,因此在文档上总难免有疏漏之处,如果因此产生了bug,则就需要花费大量的时间去排查。

在最近笔者使用QML的过程中,在Image获取资源路径的细节上就出现了这样的情况。

Image 是qml中一个非常普通的元素,通常使用方法如下:

property url imageUrl: ""  Image {  width: 120; height: 120  fillMode: Image.TileHorizontally  smooth: true  source: imageUrl == "" : "xx/me/My Data/picture.jpg" ? "resource/qtlogo.png"  }

QML代码段所在的QML文件和qtlogo都处在qt资源系统中,xx/me/My  Data/picture.jpg则值的是三个系统下实际的绝对路径,这是很异常的情况发生了。

在windows下Image的表现很正常,但是在Ubuntu下,却无法正常显示系统路径中的图片picure.jpg,一个代码显示出不同的结果来是相当费解的事,但是事实确很简单,这个source提供Url的写法是错误的,一个错误的代码自然会出现异常情况。

当QML处在qt 资源系统中,它获取图片的路径自然也是去qt资源系统中获得了,也就是说上述的两个路径变成了qrc:xx/me/My   Data/picture.jpg和qrc:resource/qtlogo.png,前者根本不在资源系统内,自然就不会显示了。

当然,对这样的情况自然有正确的解决办法,那就是对前者路径的使用应该使用file:///xx/me/My  Data/picture.jpg,这样QML才会正常解析为本地文件的路径。

至此,对于Image 资源路径可以总结出三个规律:

1.在没用使用qt资源系统时,Image的路径可以是绝对或者相对,并不需要特殊的表示;

2.当使用qt资源系统时,如果要特定知指向本地路径中的图片资源,那就要使用file://标示;

3.当获取网络图片资源并使用使用qt资源系统,由于有http表示存在,QML会自然去除qrc:标示。

其中第三点文中并没有说明,但是有兴趣的同学可以去试试。

时间: 2024-08-05 11:16:46

QML Image获取资源路径的细节的相关文章

QML Image获取图片资源路径的细节

近期重新开始Qt5,在学到QML获取本地图片资源时总是遇到类似 " QML Image: Cannot open: qrc:///images/Blue hills.jpg "的错误,即无法正常载入本地的图片资源,经过一般努力,终于搞定拉!特此记录下来,方便自己和各位同仁查询! 参考:http://mobile.51cto.com/symbian-261878.htm 一开始遇到问题的时候在网上搜索了些久都没成功解决问题,不过倒是有些启发,比如在上面网址看到的资料中就多少有些体会. 在

获取资源路径

一.web项目获取资源路径很简单 1.例如jsp中获取路径的写法如下: 1 <% 2 String path = request.getContextPath(); 3 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 4 %> 2.bean中获取路径的写法如下: 1 Str

Android4.4中获取资源路径问题

关于Android4.4的图片路径获取,如果回来的Uri的格式有两种 [java] view plaincopy content://com.android.providers.media.documents/document/image:3951 [java] view plaincopy content://media/external/images/media/3951 出现第一种Uri的操作方式如下图所示: 直接点选最近的图片,应该是Android4.4 特有的Api . 找到了一个更全

weblogic上获取资源路径

weblogic和tomcat下通用的获取路径或者加载资源的方法 1.获取路径 this.getClass().getClassLoader().getResource("/").getPath();  //格式如...../WEB-INFO/class/ 2.加载配置文件 若配置文件是在源文件根目录 InputString is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xxx

java获取资源路径的代码(方法简单 每次都遗忘 备注一下)

//通过java类获取 类名.class.getResource("/").getPath() + "文件名" 例子:HttpConnectionUtil.class .getResource("/").getPath() + "cas-service.properties" //request获取 request.getRealPath("WEB-INF/cas-service.properties")

Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext

Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Applet)是JavaServlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容是 JavaWeb中,我们将会接触到三大组件(Servlet.Filter.Listener),Servlet由服务器

wpf 前台获取资源文件路径问题

1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png"/> YT.CM.CommonUI  这是一个类库名字 Resource 这是类库下的文件夹 FloadwindowImage 是Resource下的文件夹 middle.png 是FloadwindowImage下的一张图片 若在使用上句在wpf前台获取该类库下的文件夹中的图片资源,可能会报该路径

获取类路径下的资源

对于JavaWeb而言,获取类路径下的资源,就是获取classes目录下的资源. 获取资源的方式有两种,利用Class或ClassLoader. Class类的getResourceAsStream(String path): 路径以"/"开头,相对classes路径: 路径不以"/"开头,相对当前class文件所有路径: ClassLoader类的getResourceAsStream(String path): 相对classes路径: 下面是我的目录结构: 代

Struts2中使用Velocity模板时模板资源路径配置问题

在Struts2中使用Velocity模板时,如何以相对与Web工程的路径来配置模板资源文件路径这个问题网上千篇一律的来自Velocity官方文档.官方文档中指出如果是Web工程的话,模板的相对路径是工程根路径,今天在使用的时候有如下配置: Velocity.properties(默认在WEB-INF下): resource.loader =file, classclass.resource.loader.description = Velocity Classpath Resource Loa