【大型Qt工程国际化动态更新语言不成功】
在一个大型Qt工程的国际化上遇到一个问题
首先,通过以下代码可以让当前界面的语言进行动态翻译
.h
QTranslator tran;.cpp
qApp->removeTranslator(&tran);
tran.load("XXX.qm");
qApp->installTranslator(&tran);
ui->retranslateUi(this);
但是对于一个大型Qt工程,很多情况下界面不止一个,然后就会发现只用上述代码不能让所有界面完成动态更新语言,经过探索发现,需要在其他界面中完成以下实现就可以了。
.h
protected:
virtual bool event(QEvent *e) override;.cpp
bool MyQWidget::event(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{ui->retranslateUi(this);
}
QWidget::event(e);
}
原因是Qt底层并没有具体实现主动更新翻译,但是会向所有界面发送一个语言更换事件,需要用户自己实现语言切换,虽然不知道为什么,但是好在这个解决方法还算简单。
总结一下就是,在所有需要动态更新语言的界面类实现以下代码
.h
protected:
virtual bool event(QEvent *e) override;.cpp
bool MyQWidget::event(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{ui->retranslateUi(this);
}
QWidget::event(e);
}
然后在切换某语言的槽函数中实现以下代码
.h
QTranslator tran;.cpp
qApp->removeTranslator(&tran);
tran.load("X.qm");
qApp->installTranslator(&tran);
如果保持默认语言,则调用如下代码
.h
QTranslator tran;.cpp
qApp->removeTranslator(&tran);
如与其他问题,再作探索。
