关于在资源中的QML文件中访问本地Image文件(Qt的Bug)
2011-12-20 20:51
155 查看
这里要讨论的内容是,将一个 QML 文件放置到 qrc 资源中后,需要访问本地目录的文件,比如图片的时候,遇到的一个在 Windows 和 Linux(MeeGo)平台下表现不一致的 Bug,以及处理方法。
事件起因:
一个在资源文件中的 QML 需要引用本地的图片资源。在 PC(Windows)下面运行正常,但是下到手机就是不工作,开启调试模式,发现手机里的 QML 去 qrc:/home/user/image/ 目录下面去找制定的文件去了(应该是 /home/user/image/ 目录),并报错说找不到文件,这个路径前面多出的 qrc: 显然是错误的,但是明明指定的 /home
目录怎么就跑到 qrc:/home 去了呢,这个 qrc 前缀是怎么加上的呢?
在电脑上面运行程序的时候没有出现问题,更加奇怪,在网上搜罗一番,感谢强大的网友,已经有了回答(参考文末链接「QML Image获取资源路径的细节」):
将 QML 文件放入资源后,可以不受影响的访问 qrc 资源中的文件和网络上的图片文件,但是如果访问本地文件,则会遇到 Qt 的一个 Bug,即在非 Windows 的平台上直接访问路径会变成 qrc 资源文件里的路径,从而出现找不到路径的错误。
看一下这篇文章的时间,2011年5月,也就是说Qt的这个Bug在至少半年前就一直存在了,到现在还没修改!
这里摘抄原文的一段结论:
对于Image 资源路径的三个规律:
1.在没用使用qt资源系统时,Image的路径可以是绝对或者相对,并不需要特殊的表示;
2.当使用qt资源系统时,如果要特定知指向本地路径中的图片资源,那就要使用file://标示;
3.当获取网络图片资源并使用使用qt资源系统,由于有http表示存在,QML会自然去除qrc:标示。
是不是在路径前面直接加 file:// 就解决问题了呢,经尝试,No。在非Windows环境才需要加,在Windows下加上之后又出现找不到文件的错误。
要解决这个问题就必须引入 Qt 中关于平台相关代码的几个宏了,常用的有:
Q_OS_LINUX
Q_OS_MAC
Q_OS_SYMBIAN
Q_OS_WIN32
Q_WS_X11
Q_WS_MAC
Q_WS_WIN
Q_WS_S60
Q_OS_ 是指定适用的操作系统,Q_WS_ 是指定适用的窗口系统,一般选其中一种即可,具体的用法略去,普通C++宏。
参考链接:
QML Image获取资源路径的细节
http://mobile.51cto.com/symbian-261878.htm
Qt:平台相关的代码写法
http://blog.csdn.net/hufeng825/article/details/5748680
事件起因:
一个在资源文件中的 QML 需要引用本地的图片资源。在 PC(Windows)下面运行正常,但是下到手机就是不工作,开启调试模式,发现手机里的 QML 去 qrc:/home/user/image/ 目录下面去找制定的文件去了(应该是 /home/user/image/ 目录),并报错说找不到文件,这个路径前面多出的 qrc: 显然是错误的,但是明明指定的 /home
目录怎么就跑到 qrc:/home 去了呢,这个 qrc 前缀是怎么加上的呢?
在电脑上面运行程序的时候没有出现问题,更加奇怪,在网上搜罗一番,感谢强大的网友,已经有了回答(参考文末链接「QML Image获取资源路径的细节」):
将 QML 文件放入资源后,可以不受影响的访问 qrc 资源中的文件和网络上的图片文件,但是如果访问本地文件,则会遇到 Qt 的一个 Bug,即在非 Windows 的平台上直接访问路径会变成 qrc 资源文件里的路径,从而出现找不到路径的错误。
看一下这篇文章的时间,2011年5月,也就是说Qt的这个Bug在至少半年前就一直存在了,到现在还没修改!
这里摘抄原文的一段结论:
对于Image 资源路径的三个规律:
1.在没用使用qt资源系统时,Image的路径可以是绝对或者相对,并不需要特殊的表示;
2.当使用qt资源系统时,如果要特定知指向本地路径中的图片资源,那就要使用file://标示;
3.当获取网络图片资源并使用使用qt资源系统,由于有http表示存在,QML会自然去除qrc:标示。
是不是在路径前面直接加 file:// 就解决问题了呢,经尝试,No。在非Windows环境才需要加,在Windows下加上之后又出现找不到文件的错误。
要解决这个问题就必须引入 Qt 中关于平台相关代码的几个宏了,常用的有:
Q_OS_LINUX
Q_OS_MAC
Q_OS_SYMBIAN
Q_OS_WIN32
Q_WS_X11
Q_WS_MAC
Q_WS_WIN
Q_WS_S60
Q_OS_ 是指定适用的操作系统,Q_WS_ 是指定适用的窗口系统,一般选其中一种即可,具体的用法略去,普通C++宏。
参考链接:
QML Image获取资源路径的细节
http://mobile.51cto.com/symbian-261878.htm
Qt:平台相关的代码写法
http://blog.csdn.net/hufeng825/article/details/5748680
相关文章推荐
- BUG:只有仅限于文件系统的SWF 文件和可信的本地 SWF 文件可以访问本地资源
- ASP.NET MVVM结构--之views 和 controller 访问本地资源文件
- 今天发现了JBuilder 2006 一个BUG,关于资源文件重构后的BUG
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。
- 关于跳过flex的sandbox实现访问本地资源的解决方案
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源
- SWF 文件不能访问本地资源
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。
- SWF 文件不能访问本地资源
- 关于Chrome浏览器使用ajax访问本地文件报 Cross origin requests are only supported for HTTP
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。
- 关于Applet做数字签名,授予访问本地资源
- SWF 文件不能访问本地资源 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源[转载]
- SecurityError: Error #2148: SWF 文件 (SWF 文件不能访问本地资源)
- 关于Android R文件的坑。本地图片资源id存了数据库,一开始显示正常,后来都乱序了。
- flex 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源
- SecurityError: Error #2148: SWF 文件 (SWF 文件不能访问本地资源)
- Qt中关于资源文件中加入图片