• 13348阅读
  • 9回复

[提问]QFile不能以WriteOlny,ReadWrite方式打资源文件 [复制链接]

上一主题 下一主题
离线maidisula
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-22
大家好,我使用QFile不能以WriteOnly,ReadWrite方式打资源文件,但是使用ReadOnly就可以,
也就是只能以只读方式打开资源文件,不能以读写和只写方式打开,提示的错误类型是unknown error
但是不是资源文件只读只写和读写都能成功open不知是为什么?大家有遇到这种情况的吗?
谢谢了

资源文件
//theme.qrc
<qresource prefix="theme">
       <file alias="test.txt">../options/test.txt</file>
</qresource>
代码
   1. QFile file(":/theme/test.txt");  
   2. if (!file.open(QIODevice::WriteOnly)) {  
   3.     std::cerr << "Cannot open file for writing: "
   4.               << qPrintable(file.errorString()) << std::endl;  //提示unknown error
   5.     return;  
   6. }  

[ 此帖被maidisula在2011-03-22 15:34重新编辑 ]
离线jdwx

只看该作者 1楼 发表于: 2011-03-22
看看你的资源文件属性,是不是只读?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线maidisula

只看该作者 2楼 发表于: 2011-03-22
不是只读的,是读写的属性,这是什么问题呢?
离线maidisula

只看该作者 3楼 发表于: 2011-03-22
这是怎么回事呢
把资源文件改了一个形式还是不行
//theme.qrc
<qresource>
       <file alias="test.txt">../options/test.txt</file>
</qresource>

<qresource>
       <file>../options/test.txt</file>
</qresource>

都不可以使用
file.exists(:/..options/test.txt) 能判断文件时存在的就是以读写,只读打开失败,只读就能成功,
不知为什么
离线dbzhang800

只看该作者 4楼 发表于: 2011-03-22
如果你想知道原因:

1. 首先明白资源文件是什么东西。rcc 做了什么,你的每一个xxxx.qrc文件在被C++编译器看到之前,已经变成的 qrc_xxxx.cpp 文件

2. 你可以查看该文件,看看你的资源文件是怎么存放的。其实就是一个东西
static const unsigned char qt_resource_data[]

3 自己想吧
离线maidisula

只看该作者 5楼 发表于: 2011-03-22
引用第4楼dbzhang800于2011-03-22 16:16发表的  :
如果你想知道原因:
1. 首先明白资源文件是什么东西。rcc 做了什么,你的每一个xxxx.qrc文件在被C++编译器看到之前,已经变成的 qrc_xxxx.cpp 文件
2. 你可以查看该文件,看看你的资源文件是怎么存放的。其实就是一个东西
.......

多谢指导,
我看了qrc_theme.cpp文件,这里保存着文件的绝对路径,是不是程序启动时就加载了资源文件的数据,
之后就不能对资源文件进行修改了,不知我理解的对不,
那我应该怎样修改我的程序呢?不使用资源文件吗!

我还发现了一个问题,我在程序中先向一个xml文件中写数据,写数据时没有使用资源文件的形式,因为打开文件会失败,使用局部路径,然后再读取这个文件的数据,读取时使用资源文件方式,
但是我发现因为读时这个文件时以资源文件方式使用的,所以这边写完,
再读时数据还是程序初始化时的数据,一定要退出程序重新编译,
再运行读取这个xml文件才能看到上次写入的数据。

也就是说使用资源文件在程序中对它的内容更改不会马上生效,必须重新编译-----以上是我的理解不知对不对,如果不是有资源文件就要注意路径的问题。
[ 此帖被maidisula在2011-03-22 16:37重新编辑 ]
离线dbzhang800

只看该作者 6楼 发表于: 2011-03-22
呵呵,看你写这么多,我再说点吧。

1.  不是保存路径,是将文件内容直接放到了字符数组中!然后编译进你的可执行程序,这个东西是不会变的。
2.  如果你需要的不是只读操作,不要将其放进资源!


如果感兴趣,可以看看 http://hi.baidu.com/cyclone/blog/item/8f8f08fa52d22f8758ee9006
离线maidisula

只看该作者 7楼 发表于: 2011-03-22
回 6楼(dbzhang800) 的帖子
呵呵,谢谢指导,现在明白了,
这是你的博客啊,以后要经常看看
离线roywillow

只看该作者 8楼 发表于: 2011-03-22
资源文件最终会成为程序的一部分,怎能容你随便修改……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线maidisula

只看该作者 9楼 发表于: 2011-03-22
回 8楼(roywillow) 的帖子
谢谢回复,你这个头像很常见啊
快速回复
限100 字节
 
上一个 下一个