Почему мой C ++ Qt UI был переведен, а не мои QStrings в моей программе?

Мне нужно было перевести мой английский пользовательский интерфейс на французский, поэтому я сделал все необходимое с помощью файлов .ts и .qm, загрузил его в класс QTranslator и установил в QApplication:

//in the InterfaceWidget constructor:
QTranslator myappTranslator;
bool loaded = myappTranslator.load("myApp_" + QLocale::system().name());
qDebug()  << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(&myappTranslator);
ui.setupUi(this);
ui.retranslateUi(this); //works, it translates the UI

Потом, Я создаю и присоединяю к InterfaceWidget другой виджет (во вкладке) с именем ConfigurationTabUI:

m_ConfigurationTabUI = new ConfigurationTabUI(ui.configTab);

Соответствующий интерфейс также переведен на французский, правильно.

И вот моя проблема: в методах ConfigurationTabUI он не работает, когда я пытаюсь перевести простую строку QString:

void ConfigurationTabUI::on_ValidButton_clicked(){

QString msg(ConfigurationTabUI::tr("message to translate"));
qDebug() << "translated string: " << msg; // NOT TRANSLATED
}

Я действительно понятия не имею, почему …
Спасибо за вашу помощь.

Примечание: я использую Qt5.2 и дважды проверил, что файл .ts содержит правильную переведенную строку.

1

Решение

Хорошо, я нашел проблему, это просто тупой недосмотр:

QTranslator создается в стеке, а не динамически (в куче), поэтому объект уничтожается в конце метода.
В результате он переводит пользовательский интерфейс, потому что объект все еще там, но позже, когда вызывается слот, ничего не переводится.

Вот мой код:

//in the InterfaceWidget constructor:
QTranslator* myappTranslator = new QTranslator(QApplication::instance());
bool loaded = myappTranslator->load("myApp_" + QLocale::system().name());
qDebug()  << "Is translation file loaded?" << loaded; // RETURNS TRUE
QApplication::installTranslator(myappTranslator);
ui.setupUi(this);

и в ConfigurationTabUI (который наследуется от QWidget):

void ConfigurationTabUI::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
ui.retranslateUi(this);
reset(); //my method to reload some data in UI
} else
QWidget::changeEvent(e);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]