为什么我的 C++ Qt UI 得到了翻译,但程序中的 QString 却没有?

Why my C++ Qt UI got translated but not my QStrings in my program?

我需要将英语 UI 翻译成法语,所以我使用 .ts 和 .qm 文件完成了所有必要的工作,将其加载到 QTranslator class 中,并将其安装到 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);

相应的 UI 也正确地翻译成法语。

这是我的问题:在 ConfigurationTabUI 的方法中,当我尝试翻译一个简单的 QString 时它不起作用:

void ConfigurationTabUI::on_ValidButton_clicked(){

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

我真的不知道为什么... 感谢您的帮助。

注意:我使用 Qt5.2 并仔细检查了 .ts 文件是否包含正确的翻译字符串。

好的,我发现了问题,这只是一个愚蠢的疏忽:

QTranslator 是在堆栈上创建的,而不是动态创建的(在堆上),因此对象在方法结束时被销毁。 结果,它翻译了 UI,因为对象仍然存在,但稍后,当调用插槽时,没有任何内容被翻译。

这是我的代码:

//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);
}