Qt: путь к файлу в QString

У меня проблема с сохранением пути к файлу в Windows в QString. Я использую Qt с С++.

QString resourcePath = ":/images/frog.bmp";
if( ! QFile::exists(resourcePath) )
{
    qDebug("*** Error - Resource path not found : %s",   resourcePath.data());
}

Этот код приводит к следующему:

*** Error - Resource path not found : :

Итак, я вижу, что resourcePath.data()) содержит только «:». Я предположил, что проблема в косых чертах, поэтому попытался заменить «/» на «\», но результат тот же.

Но если я напишу:

QString resourcePath = "C:\\Users\\Boris\\Desktop\\Frogger3\\images\\frog.bmp";

все работает просто отлично. Что мне не хватает? Есть ли причина, по которой двоеточие не может быть первым знаком в QString? Как мне написать путь к файлу в той же папке, что и код?

Заранее спасибо!


person speedyTeh    schedule 30.07.2013    source источник
comment
Со спецификатором формата %s qDebug ожидает строку ascii с завершающим нулем, но QString::data() возвращает указатель на представление строки UTF-16. Вместо этого вы должны использовать что-то вроде qDebug("... %s", resourcePath.toLatin1().data());.   -  person alexisdm    schedule 31.07.2013
comment
Если вы установите для resourcePath полный путь, нет никаких шансов, что он будет изменен по какой-либо причине, exists() принимает ссылку на константу. Как указывает alexisdm, это может быть проблема с вашей строкой qdebug(). (хотя я бы предложил использовать qPrintable(resourcePath))   -  person Frank Osterfeld    schedule 31.07.2013


Ответы (1)


Стиль пути к ресурсу, который вы используете, подразумевает, что файл frog.bmp находится в файле ресурсов. Поэтому либо вам нужно разрешить путь к файлу bmp во время выполнения, либо вам нужно добавить файл ресурсов в свой проект.

Если вы используете дизайнер пользовательского интерфейса, концепция файлов ресурсов обрабатывается автоматически, но если вы хотите получить доступ к ресурсам через код, вам нужно сделать несколько вещей.

Сначала создайте файл ресурсов. В визуальных студиях (с надстройкой визуальных студий) для этого есть мастер. По сути, это просто xml-файл с расширением .qrc, который выглядит примерно так:

<RCC>
    <qresource prefix="/images">
        <file>frogger.bmp</file>
    </qresource>
</RCC>

Теперь этот файл нужно обработать во время сборки. Если вы использовали файлы .ui, все аналогично. Существует инструмент под названием «rcc.exe», который принимает файл qrc в качестве входных данных и создает файл .cpp, который необходимо скомпилировать и связать с вашим проектом.

Если вы используете визуальные студии и у вас есть подключаемый модуль Qt Visual Studios, все это должно быть обработано за вас, когда вы добавляете файл qrc в проект.

Если вы используете QMake, ваш файл pri должен содержать раздел «РЕСУРСЫ», в котором вам нужно перечислить файл qrc примерно так:

RESOURCES += yourqrcfile.qrc

Теперь, когда это будет сделано. Вы можете получить доступ к своим ресурсам в коде. Ваш вызов QFile::exists должен разрешать имя файла.

В случае, когда вы помещаете свои ресурсы в статическую или общую библиотеку, вам нужно будет добавить следующую строку в свой класс, чтобы убедиться, что файл ресурсов загружен.

Q_INIT_RESOURCE(yourqrcfile);  // do not include the extension, just the name of the file.

Вот несколько ссылок, которые объясняют вещи более подробно:

Создание файла ресурсов в Qt Creator

Объяснение того, как работают файлы ресурсов

person Liz    schedule 31.07.2013
comment
Большое спасибо! Но, к сожалению, это не решило мою проблему... я все еще получаю *** Ошибка - Путь к ресурсу не найден :: - person speedyTeh; 31.07.2013
comment
Две вещи... Если вы точно воспроизвели мой файл ресурсов, в вашем случае вы должны изменить строку 2 на ‹qresource prefix=/images›. Я изменил свой ответ - извините за это. Кроме того, я видел, что на днях упоминалось, что путь к ресурсу должен иметь qrc перед :/images/frogger.bmp, что делает его qrc:/images/frogger.bmp. Мне никогда не приходилось делать это, чтобы заставить его работать, но вы тоже можете попробовать это. - person Liz; 01.08.2013