Кириллица в QT

Модератор: Модераторы разделов

hippi90
Сообщения: 83
ОС: Debian testing

Кириллица в QT

Сообщение hippi90 »

Начал читать книжку по QT, самом начале простой пример с отображением текста. Латиница отображается без вопросов, а кириллица крюкозябрами. Компилю в QT Creator

Код: Выделить всё

#include <QtGui/QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel *label = new QLabel("Привет мир!");
    label->show();
    return a.exec();
}
Спасибо сказали:
Аватара пользователя
DaemonTux
Сообщения: 1480
Статус: Юный падаван
ОС: Gentoo

Re: Кириллица в QT

Сообщение DaemonTux »

Вот так должно заработать

Код: Выделить всё

#include <QtGui/QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QLabel *label = new QLabel(tr("Привет мир!"));
    label->show();
    return a.exec();
}
Vladivostok Linux User Group
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Кириллица в QT

Сообщение hippi90 »

Выдает ошибку.
ошибка: неполный тип ‘QTextCodec’ использован во вложенном спецификаторе имени
ошибка: нет декларации ‘tr’ в этой области видимости
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Кириллица в QT

Сообщение NickLion »

Чуть-чуть подредактируем код DaemonTux ;)

Код: Выделить всё

#include <QtGui/QApplication>
#include <QLabel>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QLabel *label = new QLabel(QObject::tr("Привет мир!"));
    label->show();
    return a.exec();
}
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Кириллица в QT

Сообщение Skala »

DaemonTux писал(а):
26.10.2009 08:04
Вот так должно заработать

Код: Выделить всё

...
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
     QLabel *label = new QLabel(tr("Привет мир!"));

Зачем приучать к неканоническому/плохому стилю? ;-)

Топикстартеру:
http://wiki.linuxformat.ru/index.php/LXF79:Qt/KDE
и еще:
http://www.opennet.ru/docs/RUS/qt3_prog/x7382.html
http://hardclub.donntu.edu.ua/projects/qt/...gui_progr_2.htm

В общем вывод такой: До переводов на русский язык рано идти. Прежде нужно познакомиться с тем, что такое Linguist и вообще как делаются переводы программ.
Спасибо за внимание.
Спасибо сказали:
Аватара пользователя
iljaCPP
Сообщения: 48
ОС: Slackware

Re: Кириллица в QT

Сообщение iljaCPP »

Ну помимо перевода интерфейса могут быть иные случаи, когда в тексте программы нужно использовать кириллицу.

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QLabel *label = new QLabel("Привет мир!");

В QString к сожалению нет конструктора, принимающего const wchar_t *, а жаль.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Кириллица в QT

Сообщение NickLion »

iljaCPP писал(а):
26.10.2009 13:27
В QString к сожалению нет конструктора, принимающего const wchar_t *, а жаль.

Кстати, да. Никогда не понимал почему, ведь это родное внутреннее представление для QString'а...

UPD Хотя не, вру, в линуксе ведь wchar_t - 4 байта, а в QString - 2 байтовые символы используются, как wchar_t под виндой, да...
Но написать преобразование - уж точно не сложно!
Спасибо сказали:
Аватара пользователя
iljaCPP
Сообщения: 48
ОС: Slackware

Re: Кириллица в QT

Сообщение iljaCPP »

И std::wstring не помешал бы.
Спасибо сказали:
Аватара пользователя
iljaCPP
Сообщения: 48
ОС: Slackware

Re: Кириллица в QT

Сообщение iljaCPP »

NickLion, это не под виндой а в вижуал.
В mingw разве не 4 байта?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Кириллица в QT

Сообщение NickLion »

iljaCPP писал(а):
26.10.2009 13:45
NickLion, это не под виндой а в вижуал.
В mingw разве не 4 байта?

Да, да в Visual C++. Неправильно сказал. Просто в винде практически все исходники завязаны на то, что L"" - 2 байтные символы. Так что не гарантирую, что в другом случае все будет хорошо. Просто тот же OLE может пойти гулять :)
Спасибо сказали:
Аватара пользователя
iljaCPP
Сообщения: 48
ОС: Slackware

Re: Кириллица в QT

Сообщение iljaCPP »

Код: Выделить всё

#include <iostream>

int main() {
    std::cout<< sizeof(wchar_t)<< std::endl;
}


Код: Выделить всё

C:\>
C:\>mingw\bin\g++ d:\test.cpp

C:\>a.exe
2
C:\>


Не, тоже 2. Но я где-то натыкался, что толи при компиляции указывается, толи флагами можно задать.
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Кириллица в QT

Сообщение hippi90 »

Большое всем спасибо! Вот в этом варианте отрабатывает нормально.

Код: Выделить всё

#include <QtGui/QApplication>
#include <QLabel>
#include <QTextCodec>

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QLabel *label = new QLabel("Привет мир!");
    label->show();
    return a.exec();
}
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Кириллица в QT

Сообщение NickLion »

Продолжая оффтоп...
iljaCPP писал(а):
26.10.2009 13:56
Не, тоже 2. Но я где-то натыкался, что толи при компиляции указывается, толи флагами можно задать.

-fshort-wchar
Override the underlying type for wchar_t to be short unsigned int instead of the default for the target. This option is
useful for building programs to run under WINE.

Warning: the -fshort-wchar switch causes GCC to generate code that is not binary compatible with code generated without
that switch. Use it to conform to a non-default application binary interface.


-fno-short-wchar
Override the underlying type for wchar_t to be the default for the target, instead of using short unsigned int, which is the default for Win32.

Вот, возможно еще что-то есть. Но под виндой лучше 2 байта - меньше проблем с исходниками от МС. Да просто передать юникод строку в WinAPI будет проблемой.
Спасибо сказали:
Аватара пользователя
iljaCPP
Сообщения: 48
ОС: Slackware

Re: Кириллица в QT

Сообщение iljaCPP »

Да в принципе, если не использовать символы, выходящие за пределы 2 байт, то проблем с переносом быть не должно.
А при конвертации из char * в wchar_t * сурагатными парами заменять. Для многих программ должно подойти.
Спасибо сказали: