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

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

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

Спасибо!!

2 ответа

Решение

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

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

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

Другие вопросы по тегам