Russian Qt Forum
Ноябрь 23, 2024, 10:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировки и статические константы  (Прочитано 6104 раз)
Bojo
Гость
« : Октябрь 10, 2009, 20:11 »

Есть статическая константа в классе:
const QString ClassName::TestString = tr("тест");

В main задаю кодировки:

QTextCodec *cyrillicCodec = QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr(cyrillicCodec);
QTextCodec::setCodecForCStrings(cyrillicCodec);

Следующая строчка выявляет, что в ClassName::TestString вместо "тест" абракадабра.
Q_ASSERT(ClassName::TestString == QObject::tr("тест"));


Подозреваю это потому что статические константы инициализируются еще до вызова main? А что делать с этим?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Октябрь 10, 2009, 21:51 »

Попробуй уйти от константы, сделай переменную, которую будешь инициализировать в конструкторе класса.
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 10, 2009, 22:16 »

Подозреваю это потому что статические константы инициализируются еще до вызова main? А что делать с этим?
Подозрения правильные (без разницы статические константы или нет) - если объявлено что-то с инициализацией (не в теле функции) - это будет выполняться до main. Проблема в том что никто не гарантирует порядок инициализации, поэтому лучше написать тупее но надежнее, например

void InitGlobals( void )
{
   static bool theGlobalsReady = false;
   if (theGlobalsReady) return;
   theGlobalsReady = true;
   
   QTextCodec *cyrillicCodec = QTextCodec::codecForName("Windows-1251");
   ClassName::TestString = tr("тест");
   ...
}
Записан
Bojo
Гость
« Ответ #3 : Октябрь 11, 2009, 14:06 »

Все ясно. Но жутко неудобно вместо констант использовать переменные и инициализировать их через присваивание, когда этих констант у меня большие массивы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 11, 2009, 20:21 »

Все ясно. Но жутко неудобно вместо констант использовать переменные и инициализировать их через присваивание, когда этих констант у меня большие массивы.
c'est la vie. Я выкручиваюсь объявляя простые структуры (const char * и.т.п) а на старте перегоняю их во что-то "более интеллектуальное".
Записан
Bojo
Гость
« Ответ #5 : Октябрь 13, 2009, 08:52 »

А я решил вместо констант теперь колбасить статические методы типа
QString ClassName::GetStringConstantName1() { return tr("Руссо туристо"); }

или в случае массива
QString GetStringConstantName2(const int& index)
{
switch (index)
{
case 0: return tr("Облико морале");
case 1: return tr("Бандито");
default: throw invalid_argument("");
}
}
Записан
SASA
Гость
« Ответ #6 : Октябрь 13, 2009, 17:41 »

http://www.prog.org.ru/topic_10549_0.html
Записан
Bojo
Гость
« Ответ #7 : Октябрь 13, 2009, 19:46 »


И чем это поможет? Мне не нужен перевод на другие языки. Мне нужно, чтобы исходный русский язык нормально отображался в приложении, при условии ,что исходники пишутся в указанной кодировке "Windows-1251".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.