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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: русские буквы в qt-embedded  (Прочитано 14055 раз)
kusmich
Гость
« : Декабрь 25, 2009, 12:46 »

Всем добрый день. ПРоблема в следующем.
На отладочной плате AT91SAM9261-EK (Atmel) использую файловую систему от Angstrom, собранную в Openembedded. Ядро linux-2.6.30. Запускаю qt-шное приложение на плате. Русские буквы не отображаются. В программе пользуюсь функциями setCodecForCStrings и setCodecForTr. Причем та же самая программка на моем компьютере нормально отображает русские символы. Скомпилировала пример qt-шный с кодеками examples/tools/codecs под мой АРМ, запустила на плате - такая же история - на месте русских букв ничего нет. Может, дело в том, что в моей файловой системе нет русских локалей??? Или я не права?? Подскажите, пожалуйста, в каком направлении копать. Видела много постов о русском языке на данном форуме. Но там все вопросы касаются просто qt, а не qt-embedded. Кстати, версия qt-embedded - 4.5.3.

Спасибо.
Записан
Rcus
Гость
« Ответ #1 : Декабрь 25, 2009, 13:05 »

Первое что стоит проверить это шрифты
Записан
kusmich
Гость
« Ответ #2 : Декабрь 25, 2009, 13:43 »

А имеет ли значение, с какими ключами собиралась QT-Embedded??? Там была опция, связанная с шрифтами -freetype/-no-freetype  (я собирала без freetype). А Вы какие шрифты имеете в виду - которые в qt-шной папке lib/fonts или шрифты в файловой системе?
Записан
Dendy
Гость
« Ответ #3 : Декабрь 25, 2009, 13:48 »

Посмотрите здесь:

http://doc.trolltech.com/4.5/qt-embedded-deployment.html

Как минимум вам нужны шрифты и чтобы Qt их нашла. Если Qt лежит не в директории с префиксом, с которым она собрана - путь к шрифтам можно задать переменной окружения... забыл какой.
Записан
Dendy
Гость
« Ответ #4 : Декабрь 25, 2009, 13:51 »

И да - если ничего не мешает - собирайте уже Qt 4.6.0.
Записан
Rcus
Гость
« Ответ #5 : Декабрь 25, 2009, 14:14 »

Если собирали без FreeType то нужно использовать специальный растровый формат шрифтов .qpf. С Qt поставляются несколько готовых вариантов и утилита makeqpf для преобразования векторных шрифтов. Если отображаются только символы из набора Latin-1 то скорее всего у вас включена Helvetica, переход на Fixed/Unifont может решить проблему. Для поиска шрифтов используется функция ($QTDIR/src/gui/text/qfontdatabase_qws.cpp)
Код
C
static QString qwsFontPath()
{
   QString fontpath = QString::fromLocal8Bit(qgetenv("QT_QWS_FONTDIR"));
   if (fontpath.isEmpty()) {
#ifdef QT_FONTS_ARE_RESOURCES
       fontpath = QLatin1String(":/qt/fonts");
#else
#ifndef QT_NO_SETTINGS
       fontpath = QLibraryInfo::location(QLibraryInfo::LibrariesPath);
       fontpath += QLatin1String("/fonts");
#else
       fontpath = QLatin1String("/lib/fonts");
#endif
#endif //QT_FONTS_ARE_RESOURCES
   }
 
   return fontpath;
}
 
Записан
kusmich
Гость
« Ответ #6 : Декабрь 25, 2009, 14:16 »

Cпасибо)) попробую все варианты Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Декабрь 25, 2009, 18:04 »

kusmich, по результатам пожалуйста отпишись
Записан

Юра.
kusmich
Гость
« Ответ #8 : Декабрь 26, 2009, 19:46 »

OK) надеюсь, получится!
Записан
kusmich
Гость
« Ответ #9 : Январь 13, 2010, 17:27 »

Снова всем добрый день и с прошедшими праздниками)
Проблема с русскими буквами на отладочной плате частично решена! Я пересобрала библиотеку qt с поддержкой шрифтов (с ключом -qt-freetype) и сообщения на русском стали корректно отображаться, НО только в одном случае, а именно:
в ф-ии main я делаю:
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
и затем в любом месте программы могу написать например
Код:
button->setText("С новым годом!");
Текст будет отображаться нормально.
НО стоит только попытаться вывести текст в другой кодировке (например, обработать строку, закодированную в windows-1251, приходящую с другого устройства по TCPIP), как выводятся опять каракули. Пробовала менять кодировку конкретно для данной строки (смотрела примеры с кодеками), но безрезультатно. Если сразу в main'е задать кодировку не UTF-8, а Windows-1251, то входящие строки на русском отображаются нормально, а то, что я сама задаю из программы, наоборот становится абракадаброй.
Записан
BRE
Гость
« Ответ #10 : Январь 13, 2010, 17:51 »

Пробовала менять кодировку конкретно для данной строки (смотрела примеры с кодеками), но безрезультатно.
А можно код посмотреть как пытался?
Это все решается чтением документации по QTextCodec.
Записан
Dendy
Гость
« Ответ #11 : Январь 13, 2010, 17:53 »

Всё верно, QString( const char * ) пропускает содержимое через кодек для C-строк. Естественно поскольку кодировки могут быть разные, то слепо пользоваться таким конструктором нельзя. Вообще кодек для C-строк скорее хак для старых программ, которые не поддерживают юникод и их нужно хоть как-то заставить работать. Я бы советовал забыть про QTextCodec::setCodecForCStrings() и QTextCodec::setCodecForTr() и явно выбирать кодировку при конструировании строк. То-есть писать не
Код:
button->setText("С новым годом!");
а
Код:
button->setText(QString::fromUtf8("С новым годом!"));
если конечно же исходник сохранён в UTF8, а лучше вообще избегать не-латинских символов в исходном тексте.

При получении данных из сети делать
Код:
QString string = QTextCodec::codecForName("Windows-1251")->toUnicode(stringFromNetwork);
Записан
kusmich
Гость
« Ответ #12 : Январь 13, 2010, 19:38 »

Спасибо большое) Завтра попробую на работе Улыбающийся
Записан
kusmich
Гость
« Ответ #13 : Январь 17, 2010, 17:19 »

Всё верно, QString( const char * ) пропускает содержимое через кодек для C-строк. Естественно поскольку кодировки могут быть разные, то слепо пользоваться таким конструктором нельзя. Вообще кодек для C-строк скорее хак для старых программ, которые не поддерживают юникод и их нужно хоть как-то заставить работать. Я бы советовал забыть про QTextCodec::setCodecForCStrings() и QTextCodec::setCodecForTr() и явно выбирать кодировку при конструировании строк.
Большое Вам спасибо) Все работает!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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