2016-09-29 10 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 ...; 
} 
相關問題