如何防止Qt / cmake向Windows资源上添加回车符

时间:2018-08-29 01:58:06

标签: qt cmake resources qt5

我有一个在Linux上开发的Qt程序。其中是一些从配置文件解析的用户设置。当然,用户在首次启动时通常不会拥有该配置文件,即使它不存在,我们也希望它能正常工作,因此明智的默认值的副本存储在资源文本文件中,该文件位于与磁盘版本的格式相同。

在Windows上运行时我很烦...

资源的"\n"行结尾全部转换为"\r\n"!我真的希望不必更改解析器以选择接受一种以上的换行符。

是否有一种方法可以告诉cmake通过传递标记或类似内容来告诉Qt资源编译器不进行转换?

编辑:为了澄清情况,我将解释为什么我认为qrc正在添加换行符的所有小细节...

首先,我有一个.qrc文件,看起来像这样:

<RCC>
    <qresource prefix="/">
        <file>res/DefaultSettings.txt</file>
    </qresource>
</RCC>

使用以下代码通过cmake将其添加到可执行文件中:

qt5_add_resources(QRC_SOURCES
    resource.qrc
)

add_executable(my_project
    resource.qrc
    main.cpp
)

最后,它正在加载如下代码:

QByteArray loadResource(const QString &resource) {

    QResource res(resource);
    if(!res.isValid()) {
        qFatal("Failed to load internal resource");
    }

    // don't copy the data, if it's uncompressed, we can deal with it in place
    auto defaults = QByteArray::fromRawData(reinterpret_cast<const char *>(res.data()), res.size());

    if(res.isCompressed()) {
        defaults = qUncompress(defaults);
    }

    // NOTE: at this point, using a debugger, I observe 
    // "\r\n" newlines in the defaults byte array 
    return defaults;
}

1 个答案:

答案 0 :(得分:1)

如果通过“资源”文本文件表示通过qrc将二进制资源存储在可执行文件中,则否:qrc永远不会更改文件-它不会区分二进制和文本资源,就其而言,都是二进制文件关心。但是,诸如git之类的版本控制系统可以在签入/签出时执行此操作。您可能还使用转换行尾的API来读取文件。理想情况下,您希望有一个输出文件的复制器,然后是另一个使用qrc嵌入文件然后演示更改的行尾的复制器。