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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Локализация при перехвате qDebug [решено]  (Прочитано 6601 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Август 31, 2010, 20:24 »

Делаю локализацию для приложения и динамического плагина к нему. В главном приложении перехватываю qDebug и вывожу строки в QPlainTextEdit. Так вот строки из основного приложения туда выводятся нормально, а те, которые приходят из плагина выводятся кракозябрами. Как с эти бороться?
« Последнее редактирование: Сентябрь 03, 2010, 10:06 от xokc » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Сентябрь 01, 2010, 00:56 »

Исходники плагина и приложения в одной кодировке?
В приложении функции setCodec использовались? В плагине они также использовались? Вообще строке в tr обертывывались?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Сентябрь 01, 2010, 20:08 »

Кодировки одинаковые. В главном приложении делал setCodecForTr(UTF-8). Пробовал и в плагине такое делать - не помогает. Строки в tr обертываются. Подозреваю, что где-то по дороге из QString в char * преобразовывается, но сегодня на работе не был (1 сентября - снова в школу!), завтра посмотрю еще.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Сентябрь 02, 2010, 10:45 »

Посмотрел. Плагины собственно ни причем оказались. Но проблема не рассосалась. Делаю примерно так:
Код
C++ (Qt)
#include "mainwindow.h"
 
#include <QPlainTextEdit>
#include <QDebug>
#include <QScrollBar>
#include <QApplication>
#include <QTranslator>
 
static QtMsgHandler oldMsgHandler = 0;
 
static void logMsgHandler(QtMsgType type, const char *msg)
{
   MainWindow::instance()->log(msg);
   oldMsgHandler(type, msg);
}
 
MainWindow *MainWindow::self = 0;
 
MainWindow *MainWindow::instance()
{
   if (!MainWindow::self) {
       MainWindow::self = new MainWindow();
   }
   return MainWindow::self;
}
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
   , logView(new QPlainTextEdit(this))
{
   self = this;
   setCentralWidget(logView);
   logView->setReadOnly(true);
   logView->setMaximumBlockCount(1000);
 
   oldMsgHandler = qInstallMsgHandler(logMsgHandler);
 
   QTranslator *translator = new QTranslator(this);
   if (translator->load(QString(":/translations/test_%2.qm").arg(QLocale::system().name())))
       qApp->installTranslator(translator);
   else delete translator;
 
   QString text = tr("Test from qDebug");
   qDebug() << text.toLocal8Bit().constData();
   text = tr("Test from code");
   log(text);
}
 
MainWindow::~MainWindow()
{
   qInstallMsgHandler(oldMsgHandler);
}
 
void MainWindow::log(const QString &msg)
{
   logView->appendPlainText(msg);
   logView->verticalScrollBar()->setValue(logView->verticalScrollBar()->maximum());
}
 

При локализации получаю вместо "Тест от qDebug" (локализация для "Test from qDebug") что-то вроде "Oano ec qDebug". При
этом "Test from code" локализуется нормально. Куда копать?
« Последнее редактирование: Сентябрь 02, 2010, 15:39 от xokc » Записан
Denjs
Гость
« Ответ #4 : Сентябрь 02, 2010, 20:51 »


не скажу про вашу проблему, но :
Код:
qDebug() << text.toLocal8Bit().constData();
... по моему _это_ надо делать через setCodecForLocale
для виндовозной окнсоли так:
Код:
 defaultLocaleCodec = QTextCodec::codecForName("IBM 866");
 QTextCodec::setCodecForLocale(defaultLocaleCodec);
 qDebug() << text;

И ещё у меня  почему-то был косяк однажды, в том, что пока я в самом классе не сделал "setCodecFor..." (tr или CString - уже не помню) - у меня русские буквы из этого qDebug-ов этого класса так-же в крякозяблы выставлялись.... но насчет этого я не могу сказать точно. данво дело было...
« Последнее редактирование: Сентябрь 02, 2010, 20:54 от Denjs » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Сентябрь 03, 2010, 08:56 »

Но я же не в консоль вывожу, а в QPlainTextEdit. Как мне кажется, тут setCodecForLocale не совсем к месту. Буду пробовать.
Записан
Denjs
Гость
« Ответ #6 : Сентябрь 03, 2010, 09:20 »

Но я же не в консоль вывожу, а в QPlainTextEdit. Как мне кажется, тут setCodecForLocale не совсем к месту. Буду пробовать.
Но выводите-же вы в косоль? и при выводе строка конвертируется в кодировку локали.
Я конечно разбирался с этим более полугода назад, и точной истории появления сего куска кода у меня в main() я не помню, но "IBM 866" не с проста стоит, причем обрамленное в условную компиляцию - потому что под линуксом у меня defaultLocaleCodec  - UTF-8.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Сентябрь 03, 2010, 10:02 »

Но выводите-же вы в косоль?
Вывожу НЕ В КОНСОЛЬ - на экран в GUI в QPlainTextEdit
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Сентябрь 03, 2010, 10:06 »

В общем, сделал. Надо было сделать setCodecForLocal(codecForName("UTF-8"), а в перехватчике qDebug делать fromUtf8 перед записью в log.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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