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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема со шрифтами  (Прочитано 9680 раз)
codeLocker
Гость
« : Август 31, 2005, 18:32 »

Вызываю метод
Код:
 QMessageBox::critical(0, tr("Невозможно открыть базу данных"),
            tr("Ошибка при попытки открытия базы данных.\n"
            "Возможно не установленные необходимые драйвера."),
            QMessageBox::Cancel, QMessageBox::NoButton);

а он вместо русских букв выводит ерунду.
Что делать?

P.S.
Используется пакет qt-win-opensource-4.0.1-mingw
Записан
joktar
Гость
« Ответ #1 : Август 31, 2005, 18:43 »

Проверь кодировку исходного текста. Должна быть 1251-я.
(например в Блокноте исходник должен нормально читатся)
Если же хочется иметь НЕ 1251-ю в исходнике(а 866-ю например)
то в .pro:
DEFAULTCODEC=windows-866
а в программе:
#include <QtCore/QTextCodec>

...
[color="red"]
QTextCodec  * ourCodec=QTextCodec::codecForName("windows-866");
QTextCodec::setCodecForTr(ourCodec);
QTextCodec::setCodecForCStrings(ourCodec);
[/color]
...
Записан
codeLocker
Гость
« Ответ #2 : Август 31, 2005, 18:50 »

Кодировка Windows-1251, а он все равно ерунду пишет...
Записан
L.Marvell
Гость
« Ответ #3 : Август 31, 2005, 19:40 »

QString::fromLocal8Bit("Чего-нибудь");
Записан
codeLocker
Гость
« Ответ #4 : Август 31, 2005, 20:44 »

Спасибо, заработало!
Записан
codeLocker
Гость
« Ответ #5 : Август 31, 2005, 20:55 »

А как к этому еще и перевод привязать (QObject::tr()) ?
Записан
L.Marvell
Гость
« Ответ #6 : Сентябрь 01, 2005, 11:25 »

Цитата: "codeLocker"
А как к этому еще и перевод привязать (QObject::tr()) ?

Хм... я не пробовал, но разве так не работает: tr(fromLocal8Bit("ывлоафры")) ?
Записан
codeLocker
Гость
« Ответ #7 : Сентябрь 01, 2005, 11:33 »

функция fromLocal8Bit фозвращает QString, а функция tr описана так QString tr(char *)
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #8 : Сентябрь 01, 2005, 11:35 »

общая технология такова

пишем
tr("Hello);

потом создаем linguist перевод на русский

и выводится уже привет

вам как я понял надо наоборот

базовый русский - остальное уже по вкусу

думаю что этот фокус может не прокатить
Записан
L.Marvell
Гость
« Ответ #9 : Сентябрь 01, 2005, 16:54 »

Видимо таки да. Но если кто вдруг найдет решение, не пройдите мимо, оставьте пост. Думаю многим будет интересно.
Записан
joktar
Гость
« Ответ #10 : Сентябрь 01, 2005, 19:19 »

Фокус может не проходить так как по умолчанию Qt считает что кодировка текста внутри tr() - Latin1, а это-не так.
Есть два варианта:
- использовать не tr() а trUtf8() и соотвественно тексты в utf8
- объяснить Qt что тексты внутри tr не в Latin1

Скажем так у меня работал следующий вариант:
Условия:исходная кодировка - windows-1251,
Проверялось на 3.3.4 под Windows и Linux.

тексты внутри tr() - в перемешку русский(причем не литературный а "русский компютерный -:)") и английские, сделать нужно было два нормальных варианта интерфейса.

После раскопок в Assistant'е
(где прямо сказано что делать если ваш текст в tr() НЕ в Latin1 а например в eucKR:

void QTextCodec::setCodecForTr ( QTextCodec * c )  [static]
Sets the codec used by QObject::tr() on its argument to c. If c is 0 (the default), tr() assumes Latin1.
If the literal quoted text in the program is not in the Latin1 encoding, this function can be used to set the appropriate encoding. For example, software developed by Korean programmers might use eucKR for all the text in the program, in which case the main() function might look like this:
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        ... install any additional codecs ...
        QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));
        ...
    }

Note that this is not the way to select the encoding that the user has chosen. For example, to convert an application containing literal English strings to Korean, all that is needed is for the English strings to be passed through tr() and for translation files to be loaded. For details of internationalization, see Internationalization with Qt.
Warning: This function is not reentrant.
See also codecForTr() and setCodecForCStrings().
)
было сделано следующие:
в .pro было добавлено
// для lupdate, откуда списал-не помню,вроде бы из Assistant'а тоже
DEFAULTCODEC=windows-1251

TRANSLATIONS = ogis_t_ru.ts \
                           ogis_t_en.ts

после чего текст программы набирался как обычно:
(
QObject::tr("СуперТекст");
QString message=QString(QObject("Всего %1 вариантов")).arg(m_numVariants);
)
после чего обычный вызов lupdate/Linguist/lrelease
в main()
стояло:
**
 * Загрузка файлов переводов интерфейса
 * @param lang - язык (будет искатся соотв.файл x_3d_lang.qm)
 * @return - получилось ли
 */
bool prepareTranslators(QString lang)
//bool prepareTranslators(QApplication * qApp,QString lang)
{
    QString langfile;
    langfile="x_3d_"+lang+".qm";
    QFileInfo fi( langfile );
    if ( !fi.exists() ) {
        QMessageBox::warning( 0, "File not found",
                              QString("Cannot find translation for language: "+lang+
                                      "\n(parts of interface will be untranslated)") );
        return false;
    }
  QTranslator * translator = new QTranslator( 0 );
  translator->load( langfile, "." );
  qApp->installTranslator(translator);
  return true;

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

QTextCodec * ourCodec=QTextCodec::codecForName("windows-1251");
//строка ниже задает кодировку текста для строк внутри tr("строка")
QTextCodec::setCodecForTr(ourCodec);
//а это-для случаев когда всетаки надо использовать char *
//совместно с QString и не хочется чтобы эти char * в
// Latin1 преобразовывались
QTextCodec::setCodecForCStrings(ourCodec);
//install translator(s) to get completly translated UI
 splash->message(QObject::tr("Activating multi-language interface support..."),    Qt::AlignLeft|Qt::AlignBottom);
 prepareTranslators("ru");
...
}
Записан
L.Marvell
Гость
« Ответ #11 : Сентябрь 01, 2005, 19:44 »

Прелесть! Просто прелесть! Спасибо!
Записан
codeLocker
Гость
« Ответ #12 : Сентябрь 01, 2005, 21:00 »

Действительно круто, спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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