Как запретить Qt / cmake добавлять возврат каретки к ресурсам на окнах - PullRequest
0 голосов
/ 29 августа 2018

У меня есть программа Qt, которая была разработана для Linux. В нем есть несколько пользовательских настроек, которые анализируются из файла конфигурации. Конечно, пользователи не склонны иметь этот конфигурационный файл во время первого запуска, и мы хотим, чтобы все работало, даже если его нет, поэтому копия разумных значений по умолчанию хранится в текстовом файле ресурса, который находится в тот же формат, что и для версии на диске.

Я столкнулся с раздражением при работе на 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 голосов
/ 29 августа 2018

Если под текстовым файлом «ресурс» вы подразумеваете бинарный ресурс, хранящийся в исполняемом файле через qrc, то нет: qrc никогда не будет изменять файлы - он не различает бинарные и текстовые ресурсы, он все двоичный, насколько это обеспокоен. Системы контроля версий, такие как git, могут делать это при регистрации / проверке. Вы также можете читать файл, используя API, которые преобразуют окончания строк. В идеале вам нужен репродуктор, который выводит файл, а затем еще один, который использует qrc для встраивания файла и демонстрации измененных окончаний строк.

...