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

标签 c++ qt qt5 qfile qt-resource

我想在 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"): 设备未打开

然而,当我删除 extern Translator 对象并在主函数中创建它时,或者当用完整路径替换路径“Resources/Text/Translation.json”时,不会再出现错误

注意事项:

最好提一下,我想在我的整个应用程序中读取一次 Translator.json,为此我创建了一个 extern Translator

最佳答案

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

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

所以 QFile 应该需要(可能在全局变量的初始化步骤中)初始化以构建内部映射(名称 -> 文件)。

如果 Translator _tr; 的初始化发生在该 map 初始化之前,则会出现错误。如果之后发生,一切都应该有效。

另一种解决方案可能是

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++ - 无法读取外部类型和资源系统的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39775452/

相关文章:

c++ - 计算文字大小

c++ - 封闭范围

c++ - 在编译时确定模板函数结果的类型?

c++ - 非静态成员函数的无效使用

javascript - QWebEngine - 获取当前最大滚动值

c++ - 如何修剪存储在 std::set 中的字符串?

QTabWidget inside a QSplitter switching very slow

android - 在 chrome 下载列表中打开 apk 未打开 apk 安装程序

c++ - 如何在 QLineEdit 中重写诸如按键事件之类的事件,而不需要继承它并自己对其进行硬编码?

c++ - QListWidget 的 editItem() 输出 "edit: editing failed"