Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: solo700 от Май 12, 2010, 02:27



Название: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 12, 2010, 02:27
Не могу вывести русский текст на QGraphicsView. Установил кодировку:
   
   QTextCodec *rusCodec = QTextCodec::codecForName("CP1251");
   QTextCodec::setCodecForTr(rusCodec);
   QTextCodec::setCodecForCStrings(rusCodec);

Далее вывожу на QGraphicsView :

   QGraphicsTextItem *blinkTextItem;
   ...
   blinkTextItem=addText(str);

Выводится абракадабра. Помогите пожалуйста.



Название: Re: Русский текст на QGraphicsView.
Отправлено: lit-uriy от Май 12, 2010, 05:44
а str как заполняешь?


Название: Re: Русский текст на QGraphicsView.
Отправлено: jack_r от Май 12, 2010, 10:15
Какая кодировка в редакторе?
Что если поставить кодировку в редакторе UTF-8 и установить такое же кодек в программе?
Код:
QTextCodec *rusCodec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(rusCodec);
QTextCodec::setCodecForCStrings(rusCodec);


Название: Re: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 12, 2010, 14:20
Цитировать
а str как заполняешь?

Как только не заполнял :
str=tr("Старт 555");
str="Старт 555";

blinkTextItem=addText(str);
blinkTextItem=addText(tr(str));

Цитировать
QTextCodec *rusCodec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(rusCodec);
QTextCodec::setCodecForCStrings(rusCodec);

Кодировку в редакторе менял на System, CP1251, KOI8-R, UTF-8
Выставлял аналогичный кодек - результата никакого.


Название: Re: Русский текст на QGraphicsView.
Отправлено: ufna от Май 12, 2010, 14:52
попробуй QTextCodec::codecForName("Windows-1251");


Название: Re: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 12, 2010, 15:19
Цитировать
Что если поставить кодировку в редакторе UTF-8 и установить такое же кодек в программе?

Проект создавался в System. Там полно русских комментов. Если в редакторе установить UTF-8, то при перезагрузки проекта Qt Creator не сможет перекодировать всё это. Придется перелапачивать ручками, что не есть гуд.
Цитировать
попробуй QTextCodec::codecForName("Windows-1251");

Не работает.

Прям засада какая то. В принципе заполнение строк из редактора это в качестве примера сделал ... и охренел. Заполнение будет из файлов. Думаю там я разберусь. Но вопрос какой то страшно принципиальный.


Название: Re: Русский текст на QGraphicsView.
Отправлено: lit-uriy от Май 12, 2010, 23:50
русские коменты при какой кодировке правильно отображаются? Т.е. с начало надо наверняка выяснить кодировку самого файла с исходным кодом.

Самый переносимый вариант, конечно, писать все строковые литералы по аглицки. Затем лингвистом сделать их перевод и подгрузить к программе.


Название: Re: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 13, 2010, 01:43
Цитировать
русские коменты при какой кодировке правильно отображаются? Т.е. с начало надо наверняка выяснить кодировку самого файла с исходным кодом.

Проект параллельно ведется на виндах и линухе (точнее по одному на каждой системе). В виндах кодировка System в линухе CP1251. Обновляются последние измененные файлы (хидеры, исходники, формы - файлы проектов естественно не трогаются). Всё корректно отображается и работает. Текст на GraphicsView одинаково коряво отображается и в виндах и линухе.
Кстати интересный момент ...
Код:
void KViewFlasher::drawBackground(QPainter *painter, const QRectF &rect)
{
    Q_UNUSED(rect);
    QRectF sceneRect = this->sceneRect();
...
    painter->drawText(textRect, "Старт 555");
...
}
Этот вариант работает нормально во всех системах.
Но очень хотелось бы побороть коллекцию сцены.


Название: Re: Русский текст на QGraphicsView.
Отправлено: lit-uriy от Май 13, 2010, 13:44
>>Этот вариант работает нормально во всех системах.
этот вариант работает благодаря QTextCodec::setCodecForCStrings(rusCodec);
попробуй этот же код, только строку оберни в tr()
при этом кодек для tr должен быть такой как написал ufna, т.е.:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));


Название: Re: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 13, 2010, 17:08
Цитировать
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

Это я уже пробовал. Не работает.


Название: Re: Русский текст на QGraphicsView.
Отправлено: lit-uriy от Май 13, 2010, 20:59
>>Это я уже пробовал.
А при этом строку в tr() оборачивал?


Название: Re: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 14, 2010, 00:21
Цитировать
А при этом строку в tr() оборачивал?

оборачивал
Код:
    QTextCodec *rusCodec = QTextCodec::codecForName("Windows-1251"); // в функции main
    QTextCodec::setCodecForTr(rusCodec);
    QTextCodec::setCodecForCStrings(rusCodec);

    blinkTextItem=addText(tr("Старт 555"));// в другой функции

абракадабра


Название: Re: Русский текст на QGraphicsView.
Отправлено: solo700 от Май 14, 2010, 03:10
Добил сцену.
Неработающий вариант этот :
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    QTextCodec *rusCodec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(rusCodec);
    QTextCodec::setCodecForCStrings(rusCodec);

    w.show();
    return a.exec();
}
Пробный русский текст загонял в конструкторе сцены, ктр. отрабатывался в MainWindow w ... а русского кодека ещё не было. А на виде в drawBackground паинтером пробный текст отрисовывался корректно.
Работающий вариант этот:
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec *rusCodec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(rusCodec);
    QTextCodec::setCodecForCStrings(rusCodec);

    MainWindow w;
    w.show();
    return a.exec();
}
Пытался вспомнить с какого перепоя когда то я так кодек разместил? Не вспомнил. Вошло в привычку.
Всем спасибо !