【发布时间】:2016-09-29 16:23:32
【问题描述】:
我想在一个c++类中通过Qt资源系统读取一个json文件。
假设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
【问题讨论】:
-
可能是全局变量初始化的顺序问题。一个解决方案可能是在所有其他全局变量之后初始化
_tr。例如:用Translator* _tr = nullptr;声明它并在main的开头或在使用它的第一个函数中调用_tr = new Translator。 -
@Frank.Could 你再看看我的 Translator.h。实际上我希望在我们包含 Translator.h 的每个源文件中,我们将能够使用 Tr() 函数并在 main 中初始化或在我的情况下无法在每个源文件中进行初始化
-
例如,您可以使用
if (!_tr) _tr = new Tranlator; return _tr->valueAt...定义Tr(...)。这只是隔离问题的第一个建议。 -
@frank.如果我将文件(在构造函数中)声明为完整路径,例如 ""C:/Users/
/Documents/Resources/Text/Translation.json “没有更多的错误。你知道为什么会这样吗? -
我不知道
QIODevice,但它可能使用全局变量初始化步骤中定义的资源来从相对路径中找到完整路径。我用谷歌搜索。
标签: c++ qt qt5 qfile qt-resource