qt строка "ресурс" - PullRequest
       2

qt строка "ресурс"

9 голосов
/ 05 июня 2011

Я хочу, чтобы у меня было место для хранения всех строк, используемых в моем приложении, чтобы я мог изменять их в одном месте, а не во всех местах.Что-то вроде файла ресурсов, где я могу поставить метку на строки и просто вызвать метку.

Я не знаю ничего, что предлагает QT для этого, поэтому мне просто нужно создать файл заголовка свсе эти строки и включить его везде, где мне это нужно?Как правильно это сделать, и не могли бы вы привести небольшой пример?

Спасибо !!

Ответы [ 2 ]

6 голосов
/ 05 июня 2011

Я еще не использовал его, но я думаю, что Qt Internationalization позволит вам сделать что-то вроде этого, так как один из его вариантов - удалить все строки из кода приложения, чтобы они могли быть заменены переводами. , Даже если вы не хотите использовать какие-либо другие функции этого модуля, он позволит вам решить вашу проблему. Замена строки для метки будет выглядеть так:

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

Функция tr () уже является частью классов Qt, и вы бесплатно получаете еще несколько функций и макросов, которые помогают искать и заменять строки. Заменяемыми строками можно управлять с помощью QtLinguist. Вы можете найти более подробное объяснение здесь: Интернационализация с Qt

3 голосов
/ 09 декабря 2011

В старые времена [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 (безобразная зависимость) и мог пойти и прочитать пароль строки. #Define определенно очень уродлив в современном C ++, но ресурсы не будут понимать статическую переменную const или встроенную функцию.

Самый простой способ воспроизвести это несколько похожим способом - использовать заголовочный файл со строковыми объявлениями, а затем ссылаться на эти строки везде, где они вам нужны.

// 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] В этом последнем примере строковая ссылка использует (), так как это вызов функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...