无法读取外部类型和资源系统的文件
Can not read file with extern type and resource system
我想通过 C++ 中的 Qt 资源系统读取 json 文件 class。
假设 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
在Cannot open resource file中,第一个解决方案可以是运行再次qmake。可能会使用新的依赖信息更改 link 版本。
这是一个可能的解释。 Qt 在读取 .qrc
的内容之前无法消除“:\Resources\Text\Translation.json” 的歧义,即使 .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 ...;
}
我想通过 C++ 中的 Qt 资源系统读取 json 文件 class。
假设 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
在Cannot open resource file中,第一个解决方案可以是运行再次qmake。可能会使用新的依赖信息更改 link 版本。
这是一个可能的解释。 Qt 在读取 .qrc
的内容之前无法消除“:\Resources\Text\Translation.json” 的歧义,即使 .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 ...;
}