簡體   English   中英

qt “資源”字符串

[英]qt “resource” string

我想要一個可以存儲應用程序中使用的所有字符串的地方,這樣我就可以在一個地方而不是所有地方修改它們。 類似於資源文件的東西,我可以在其中將 label 放在字符串上,然后調用 label。

我不知道 QT 為此提供了什么,所以我只需要創建一個包含所有這些字符串的 header 文件並將其包含在我需要的任何地方嗎? 這樣做的適當方法是什么,你能舉一個小例子嗎?

謝謝!!

我還沒有使用它,但我認為 Qt 國際化將允許您執行此類操作,因為其中一個選項是將所有字符串從應用程序代碼中取出,以便它們可以被翻譯替換。 即使您不想使用此模塊的任何其他功能,它也可以解決您的問題。 替換 label 的字符串如下所示:

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

tr() function 已經是 Qt 類的一部分,您還可以免費獲得一些有助於搜索和替換字符串的函數和宏。 然后可以使用 QtLinguist 管理要替換的字符串。 您可以在此處找到更詳細的說明:使用 Qt 進行國際化

過去[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 資源(丑陋的依賴關系)並且可以 go 並讀取字符串密碼。 #define 在現代 C++ 中絕對是非常丑陋的,但資源無法理解 static 常量變量或內聯 function。

以某種類似的方式復制它的最簡單方法是使用帶有字符串聲明的 header 文件,然后在需要它們的任何地方引用這些字符串。

// 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] function 可以將 std::string 返回到 100% 防止修改原始文件。

[3]在最后一個示例中,字符串引用使用 (),因為它是 function 調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM