我想通过C++类中的Qt资源系统读取json文件。无法读取具有extern类型和资源系统的文件
假设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
对象,并创建一个在主要功能或在更换路径“资源/文本/ Translation.json”完整路径没有更多的错误
注:
可能是很好的一提的是,我想在我的整个应用程序读取Translator.json
一次,为我创造一个extern Translator
这可能是在全局变量的初始化一个顺序的问题。一个解决方案可能是在所有其他全局变量之后初始化'_tr'。例如:用'Translator * _tr = nullptr;'声明它,并在'main'的开头或在使用它的第一个函数中调用'_tr = new Translator'。 – Franck
@ Frank.Could你请再看看我的Translator.h。实际上我想在每个源文件中包含Translator.h,我们将能够使用Tr()函数并初始化主文件或初始化每个源文件不可能为我的情况 – IMAN4K
你可以例如用'if(!_tr)_tr = new Tranlator来定义'Tr(...)';返回_tr-> valueAt ...'。这只是隔离问题的第一个建议。 – Franck