2011-06-05 282 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