Russian Qt Forum

Qt => Qt Embedded => Тема начата: kusmich от Декабрь 25, 2009, 12:46



Название: русские буквы в qt-embedded
Отправлено: 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.

Спасибо.


Название: Re: русские буквы в qt-embedded
Отправлено: Rcus от Декабрь 25, 2009, 13:05
Первое что стоит проверить это шрифты


Название: Re: русские буквы в qt-embedded
Отправлено: kusmich от Декабрь 25, 2009, 13:43
А имеет ли значение, с какими ключами собиралась QT-Embedded??? Там была опция, связанная с шрифтами -freetype/-no-freetype  (я собирала без freetype). А Вы какие шрифты имеете в виду - которые в qt-шной папке lib/fonts или шрифты в файловой системе?


Название: Re: русские буквы в qt-embedded
Отправлено: Dendy от Декабрь 25, 2009, 13:48
Посмотрите здесь:

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

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


Название: Re: русские буквы в qt-embedded
Отправлено: Dendy от Декабрь 25, 2009, 13:51
И да - если ничего не мешает - собирайте уже Qt 4.6.0.


Название: Re: русские буквы в qt-embedded
Отправлено: Rcus от Декабрь 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;
}
 


Название: Re: русские буквы в qt-embedded
Отправлено: kusmich от Декабрь 25, 2009, 14:16
Cпасибо)) попробую все варианты :)


Название: Re: русские буквы в qt-embedded
Отправлено: lit-uriy от Декабрь 25, 2009, 18:04
kusmich, по результатам пожалуйста отпишись


Название: Re: русские буквы в qt-embedded
Отправлено: kusmich от Декабрь 26, 2009, 19:46
OK) надеюсь, получится!


Название: Re: русские буквы в qt-embedded
Отправлено: kusmich от Январь 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, то входящие строки на русском отображаются нормально, а то, что я сама задаю из программы, наоборот становится абракадаброй.


Название: Re: русские буквы в qt-embedded
Отправлено: BRE от Январь 13, 2010, 17:51
Пробовала менять кодировку конкретно для данной строки (смотрела примеры с кодеками), но безрезультатно.
А можно код посмотреть как пытался?
Это все решается чтением документации по QTextCodec.


Название: Re: русские буквы в qt-embedded
Отправлено: Dendy от Январь 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);


Название: Re: русские буквы в qt-embedded
Отправлено: kusmich от Январь 13, 2010, 19:38
Спасибо большое) Завтра попробую на работе :)


Название: Re: русские буквы в qt-embedded
Отправлено: kusmich от Январь 17, 2010, 17:19
Всё верно, QString( const char * ) пропускает содержимое через кодек для C-строк. Естественно поскольку кодировки могут быть разные, то слепо пользоваться таким конструктором нельзя. Вообще кодек для C-строк скорее хак для старых программ, которые не поддерживают юникод и их нужно хоть как-то заставить работать. Я бы советовал забыть про QTextCodec::setCodecForCStrings() и QTextCodec::setCodecForTr() и явно выбирать кодировку при конструировании строк.
Большое Вам спасибо) Все работает!!!