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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое изменение перевода  (Прочитано 5482 раз)
Sergey
Гость
« : Май 28, 2013, 11:45 »

 Здравствуйте ! Сделал перевод как и описывалось в доке, все нормально. Проблема с динамическим переводом. Прочитал и Шлее и Бланшет по поводу перевода . По  форуму рыскал нашел варианты-попробовал все равно не получается . Не совсем понимаю в какой момент времени указывать функцию retranslateUI ? попробовал сделать в виде меню просто соединил сигналом и слотом , что когда нажимаю на кнопку загружается русский , но такой вариант не прокатил. Подскажите пожалуйста !

Заранее благодарен !
Записан
Serr500
Гость
« Ответ #1 : Май 28, 2013, 11:57 »

см. QCoreApplication::installTranslator. retranslateUi вызовется автоматически.
Записан
Sergey
Гость
« Ответ #2 : Май 28, 2013, 13:10 »

Я его и использовал , ну давайте разберем напримере. Вот код одного из моих файлов , я хочу перевести ну например слово Language или Settings. В Qt Linguist все сохранил и скомпилил , в чем моя ошибка  ?
Код:
#include <QtGui>
#include<handle.h>
#include<klavishi.h>

Handle::Handle(QWidget*parent)
:QWidget(parent)
{
}
void Klavishi ::handle_channel()
{
    QWidget * handle_widget = new QWidget;
    handle_widget->setFixedSize(480,230);
    handle_widget->setWindowTitle(tr("Settings"));
    handle_widget->show();

    QVBoxLayout * settings_layout = new QVBoxLayout;
    settings_layout->setMargin(0);
    settings_layout->setSpacing(0);

    QHBoxLayout * menuLayout = new QHBoxLayout;


    QMenu * menu = new QMenu(tr("&Language"));
    menu->addAction("&English");
    QMenuBar * pmenu = new QMenuBar;
    pmenu->addMenu(menu);
    connect(menu,SIGNAL(clicked()),SLOT(changeLanguage()));

     menuLayout->addWidget(pmenu);
    settings_layout->addLayout(menuLayout);
    handle_widget->setLayout(settings_layout);
}
void Handle::changeLanguage(){
    QTranslator translator;
     translator.load("D:\\RDM-11\\project_rdm_11\\interface1-2\\klavishi_ru.qm");
     qApp->installTranslator(&translator);
}
void Handle::changeEvent(QEvent *event){
    if (event->type()==QEvent::LanguageChange){
        setWindowTitle(tr("Settings"));
    }else
        Handle::changeEvent(event);
}

Записан
Serr500
Гость
« Ответ #3 : Май 29, 2013, 12:11 »

Ошибка тривиальная для новичков. И если посмотреть на код повнимательнее, то она становится очевидной. Смотрите.

В методе Handle::changeLanguage создаётся объект translator. Затем в него грузится файл (кстати, надо проверять успешность, не зря же метод что-то возвращает). Далее транслятор инсталлируется. А что происходит в следующей строчке, где находится закрывающая фигурная скобка метода? Многие думают, что ничего. Но это не так! И если зайти в дизассемблированный код, то мы увидим, что там происходит очень много интересного! Например, разрушаются локальные переменные...

Опа! Вот где ошибка! При выходе из метода объект translator благополучно похеривается! И при этом (он же потомок QObject) шлёт в QCoreApplication сигнал destroyed. Что же делает QCoreApplication? Правильно, убирает ссылку на транслятор. То есть транслятора у нас снова нет!

Выход? "Элементарно, Ватсон!" (C) Шерлок Холмс.
Код:
static QTranslator translator;
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #4 : Декабрь 24, 2013, 04:32 »

QTranslator *translator=new QTranslator;
translator->load()....

qApp->installTranslator(translator);
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Декабрь 24, 2013, 12:52 »

так будет утечка памяти при повторных вызовах смены языка
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kefir500
Гость
« Ответ #6 : Январь 24, 2014, 12:41 »

retranslateUi() работает только для виджетов созданных в Qt Designer.
В Вашем случае нужно создать отдельный метод, выставляющий текст у виджетов:
Код:
void Handle::retranslate()
{
    handle_widget->setWindowTitle(tr("Settings"));
    menu->setTItle(tr("&Language"));
}
И вызывать этот метод при запуске программы (после создания виджетов, разумеется), а также при смене языка.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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