我想通过ct类中的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

最佳答案

Cannot open resource file中,第一个解决方案是再次运行qmake。可能会使用新的依赖项信息来更改链接版本。

这是一个可能的解释。 Qt在读取.qrc的内容之前,即使.qrc已编译在可执行文件中,也无法消除歧义“:\ Resources \ Text \ Translation.json”。

因此,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 ...;
}

10-06 14:33