2016-09-29 49 views
1

我想通过C++类中的Qt资源系统读取json文件。无法读取具有extern类型和资源系统的文件

假设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对象,并创建一个在主要功能或在更换路径“资源/文本/ Translation.json”完整路径没有更多的错误

注:

可能是很好的一提的是,我想在我的整个应用程序读取Translator.json一次,为我创造一个extern Translator

+1

这可能是在全局变量的初始化一个顺序的问题。一个解决方案可能是在所有其他全局变量之后初始化'_tr'。例如:用'Translator * _tr = nullptr;'声明它,并在'main'的开头或在使用它的第一个函数中调用'_tr = new Translator'。 – Franck

+0

@ Frank.Could你请再看看我的Translator.h。实际上我想在每个源文件中包含Translator.h,我们将能够使用Tr()函数并初始化主文件或初始化每个源文件不可能为我的情况 – IMAN4K

+0

你可以例如用'if(!_tr)_tr = new Tranlator来定义'Tr(...)';返回_tr-> valueAt ...'。这只是隔离问题的第一个建议。 – Franck

回答

1

Cannot open resource file,第一SOLU可以重新运行qmake。也许可能会用新的依赖信息来更改链接版本。

这里是一个可能的解释。 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 ...; 
} 
相关问题