Как рекурсивно использовать retranslateUi() для всего пользовательского интерфейса в QMainWindow?

#c #qt5 #locale #qwidget #qtranslator

Вопрос:

В моем приложении Qt5 я пытаюсь переключить язык во время выполнения. До сих пор здесь моя простая функция:

 QTranslator _translator;

void MainWindow::switchLanguage(QString lang)
{
    if (!_translator.isEmpty()) qApp->removeTranslator(amp;_translator);
    if (lang == "it")
    {
        _translator.load("Language_it_IT.qm", qApp->applicationDirPath());
        qApp->installTranslator(amp;_translator);
    }
    ui->retranslateUi(this);
}
 

Это работает нормально, но только для MainWindow одного. Внутри у меня есть несколько классов форм (с их пользовательскими интерфейсами), которые я загружаю в QStackedWidget :

 FormMonitor _formMonitor;    // they all inherit from QWidget
FormSettings _formSettings;  // and have their .ui file
FormProgram _formProgram;

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    // ...
    ui->stackedWidget->addWidget(amp;_formMonitor);
    ui->stackedWidget->addWidget(amp;_formSettings);
    ui->stackedWidget->addWidget(amp;_formProgram);


    // ...
}

void MainWindow::loadView(int index)
{
    ui->stackedWidget->setCurrentIndex(index);
}
 

Эти формы не переводятся.

Как я могу перевести все «вложенные» формы внутри моей MainWindow ?

Ответ №1:

Переопределите changeEvent классы форм следующим образом:

 void Form::changeEvent(QEvent *e)
{
    if (e->type() == QEvent::LanguageChange)
        ui->retranslateUi(this);

    QWidget::changeEvent(e);
}