无法读取外部类型和资源系统的文件



我想在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, ":ResourcesTextTranslation.json"): device not open

但是,当我删除extern Translator对象并在main函数中创建该对象时,或者替换路径"Resources/Text/Translation.json"有了完整的路径,就没有错误了

<标题>注意:我想在我的整个应用程序中读取Translator.json一次,因此我创建了一个extern Translator

在无法打开资源文件时,第一个解决方案是再次运行qmake。它可能会用新的依赖信息改变链接版本。

这是一个可能的解释。Qt不能消除歧义":资源文本翻译。在读取.qrc的内容之前,即使.qrc是在可执行文件中编译的。

所以QFile应该需要(可能在全局变量初始化的步骤中)一个初始化来构建一个内部映射(name -> file)。

如果您的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 ...;
}

相关内容

  • 没有找到相关文章

最新更新