2011-06-05 253 views
9

我想有一個地方,我可以存儲我的應用程序中使用的所有字符串,所以我可以修改它們在一個地方,而不是所有的地方。就像資源文件一樣,我可以在這些字符串上放一個標籤,然後調用標籤。qt「資源」字符串

我不知道QT爲此提供了什麼,所以我只需要創建一個包含所有這些字符串的頭文件,並將它包含在我需要的任何地方?什麼是適當的方式來做到這一點,你可以提供一個小例子?

謝謝!

回答

6

我還沒有使用它,但我認爲,Qt國際化會讓你做這樣的事情,因爲它的一個選擇是從應用程序代碼中取出所有字符串,以便它們可以被替換翻譯。即使您不想使用此模塊的任何其他功能,也可以讓您解決您的問題。一個標籤替換字符串應該是這樣的:

QLabel *label = new QLabel(tr("Password:")); 

的TR()函數已經是Qt類的一部分,你會得到一些更多的功能和宏免費是幫助搜索和替換字符串。 然後可以使用QtLinguist管理要替換的字符串。 您可以在這裏找到更詳細的解釋:Internationalization with Qt

+0

'tr()'是這樣做的最好方法,我同意。 – levu 2011-06-05 17:47:06

+0

我會進一步研究這一點,並讓你知道結果。謝謝 – prolink007 2011-06-05 17:49:28

+2

確實。我使用翻譯工具爲測試/調試提供了非常詳細的字符串,並在不同的翻譯單元中進行交換以減少發佈時間。 – 2011-06-05 19:25:23

3

在過去[1],使用Windows資源時,人們一直在使用:

// in your project_strings.h file 
#define STRING_PASSWORD 1 
... 

// resources project.rc 
#include "project_strings.h" 
STRINGTABLE 
BEGIN 
STRING_PASSWORD "Password:" 
... 
END 

// in some other file 
#include "project_strings.h" 
CString str(STRING_PASSWORD); 

CString的知道有關Windows資源(醜陋的依賴)並可以去讀取字符串密碼。現代C++中的#define確實非常醜陋,但資源不能理解靜態常量變量或內聯函數。

以相似的方式複製它最簡單的方法是使用帶有字符串聲明的頭文件,然後在需要它們的任何位置引用這些字符串。

// in your project_strings.h 
namespace MyProjectStrings { 
const char *password; 
... 
} 

// the project_strings.cpp for the strings 
#include "project_strings.h" 
namespace MyProjectStrings { 
const char *password = "Password:"; 
... 
} 

// some random user who needs that string 
#include "project_strings.h" 
std::string password(MyProjectStrings::password); 

現在所有的字符串都在project_strings.cpp,你不能那樣容易將它們與TR()翻譯......但你可以改變所有這些字符串聲明與功能:

// in your project_strings.h 
namespace MyProjectStrings { 
const char *password(); //[2] 
... 
} 

// the project_strings.cpp for the strings 
#include "project_strings.h" 
namespace MyProjectStrings { 
const char *password() { return QObject::tr("Password:"); } 
... 
} 

// some random user who needs that string 
#include "project_strings.h" 
std::string password(MyProjectStrings::password()); //[3] 

,瞧!你在一個地方有一個單一的長桌,並且可以翻譯。

[1]許多人仍然使用該方案!

[2]該函數可以將std :: string返回爲100%,以防止修改原始內容。

[3]在這最後一個例子中,字符串引用使用(),因爲它是一個函數調用。

+0

在你的例子中,你像返回tr(「Password」);'忘記'tr'是QObject的靜態方法,並且當你在派生類的外部使用它時,你應該'return QObject :: tr(「密碼「)'。 – 2016-05-20 15:42:34