2016-12-07 139 views
0

我正在制作应用程序的一部分,它是从存储一些首选项的XML读取的。但是,无论何时构建项目,所有源都会被复制,但首选项文件不会被复制!我已经添加了以下到.pro文件 -
RESOURCES += rsc.qrc

而我rsc.qrc包含Qt - 将文件添加到项目

<!DOCTYPE RCC><RCC version="1.0"> 
<qresource> 
    <file>data/preferences.xml</file> 
    <file>data/gamedata.xml</file> 
</qresource> 
</RCC> 


现在,每当我试图打开的preferences.xml

QFile preferences(":/data/preferences.xml"); 
if(!preferences.exists()){ 
    preferences.open(QFile::WriteOnly); 
    preferences.write("abc"); 
    qDebug() << "Written"; 
} 
else { 
    qDebug() << "File exists"; 
} 

绝对没有打印,甚至应用程序的其余部分停止工作。

+0

能否请您澄清哪里源文件复制,当您生成项目? – demonplus

+0

@demonplus我已经对我提出的代码做了一些修改。让我知道是否有什么我做错了! – Zeokav

+0

文件是否在数据文件夹中(文件夹是否存在)?你可以调试应用程序吗? – demonplus

回答

0

您在示例中没有正确使用资源部分。 这很可能不起作用,因为您在构建应用程序后尝试写入嵌入到可执行文件中的资源。阅读很好,但写作不能按照定义工作。

如果您想要一个可编辑的设置文件,您必须将它们与您的可执行文件一起分发,或者使用不同的方法读取/写入您的设置,如QSettings。

但是使用QSettings也意味着,如果使用默认配置,则需要在加载函数中配置所有默认设置,以防这些值不存在。意思是你在Windows上使用注册表。

您可以选择在QSettings的构造函数中强制使用INI文件格式,如果您想提供默认设置INI文件而不是xml文件,这可能很有意义。

如果你想存储更复杂的数据,无论如何可能需要一个xml文件,所以如果你想坚持这一点,你需要一种方法来将你的设置文件复制到你的构建路径。这可以使用QMAKE_POST_LINK在您的专业文件中完成。

例子:

COPY_CMD = "$$PWD\\data\\preferences.xml $$OUT_PWD\\release\\data\\preferences.xml" 
COPY_CMD = $${QMAKE_COPY} $$replace(COPY_CMD, "/", "\\") $$escape_expand(\\n\\t) 
QMAKE_POST_LINK += $$COPY_CMD