Я хочу прочитать файл json через систему ресурсов Qt в классе c ++.
Предполагать Translator.h
:
class Translator
{
public:
Translator();
void read(const QString &fpath);
QString valueAt(const QString &key) const;
};
extern Translator _tr;
inline QString Tr(const QSTring &key) {
return _tr.valueAt(key);
}
А также Translator.cpp
:
Translator::Translator() {
read(":/Resources/Text/Translation.json");
}
void Translator::read(const QString &fpath) {
QFile f(fpath);
f.open(QIODevice::ReadOnly | QIODevice::Text);
f.readAll(); // f.errorString() -> no such file or directory
f.close();
}
Translator _tr;
А также .qrc
файл:
.qrc:
<RCC version="1.0">
<qresource>
<file>Resources/Text/Translation.json</file>
</qresource>
</RCC>
Каждый раз, когда я запускаю код выше, я получаю сообщение об ошибке:
QIODevice::read (QFile, ":\Resources\Text\Translation.json"): device not open
Однако, когда я удаляю extern Translator
создайте объект и создайте его в главной функции или при замене пути «Resources / Text / Translation.json» на полный путь ошибки больше нет
может быть хорошо упомянуть, что я хочу прочитать Translator.json
один раз во всем моем приложении и для этого я создаю extern Translator
В Не удается открыть файл ресурсов, Первое решение может быть снова запустить qmake. Может быть, вероятно, изменить ссылку ссылки с новой информацией о зависимостях.
Вот возможное объяснение. Qt не может устранить неоднозначность «: \ Resources \ Text \ Translation.json», прежде чем он прочитает содержимое .qrc
даже если .qrc
компилируется в исполняемый файл.
Так QFile
должна потребоваться (вероятно, на этапе инициализации глобальных переменных) инициализация для построения внутренней карты (имя -> файл).
Если ваша инициализация Translator _tr;
происходит до инициализации этой карты, у вас есть ошибка. Если это произойдет после, все должно работать.
Другое решение может быть
class Translator
{
public:
Translator();
void read(const QString &fpath);
QString valueAt(const QString &key) const;
private:
bool m_ready;
};
Translator::Translator() : m_ready(false) {}
void Translator::read(const QString &fpath) {
QFile f(fpath);
f.open(QIODevice::ReadOnly | QIODevice::Text);
f.readAll(); // f.errorString() -> no such file or directory
f.close();
}
QString Translator::valueAt(const QString &key) const {
if (!m_ready) {
m_ready = true;
read(":/Resources/Text/Translation.json");
}
...
return ...;
}
Других решений пока нет …