Qt多语言动态切换
有个软件,里面做了13种语言,销售要求实现重新设置软件语言后,不需要重启软件,就可以看到软件显示出对应的语言。
软件中所有需要翻译的地方都是用的 tr(QString) 来做的,并且软件是多个窗口(QDialog),需要在设置窗口中设置语言,然后其他窗口的语言也发生变化。
最开始的做法是:
1.重新加载语言 qApp->installTranslator(QTranslator &messageFile);
2.重写 changeEvent 事件
3.在 changeEvent 事件中接收到 软件语言发生变化后,就刷新窗口 ui.retranslateUi(this);
流程是这个流程,方法是这个方法,但是就是不生效,无法动态切换,然后就是各种百度,基本都是前篇一律,一个抄一个,没啥用。
然后耗费了大量的时间后,看到了一个有用的:https://bbs.csdn.net/topics/392090653
从回复中,可以学习到Qt翻译的过程是: installlTranslater() -> changeEvent(QEvent::LanguageEvent) -> retranslate()/retranslateUI()。
大佬也有告诉我们在 changeEvent 之前,我们需要重新设置一遍 setText(tr())
然后经过不懈的努力,终于实现了,代码可以参考下面的:
*: 写一个函数,把所有的 setText(tr()) 都放在这个函数中处理。每次切换完语言,重新 setText(tr()),然后在刷新界面。
*: 如果其他窗口中的多语言没有生效,请注意内存分区。可以将变量:QTranslator trans 放在全局区,如下面的代码第二行。
#include "QtWidgetsApplication1.h" QTranslator trans; QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent) : QDialog(parent) { ui.setupUi(this); mySetUiText(); connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(change1())); connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(change2())); } QtWidgetsApplication1::~QtWidgetsApplication1() {} void QtWidgetsApplication1::changeEvent(QEvent * e) { if (e->type() == QEvent::LanguageChange) { ui.retranslateUi(this); // 如果UI上的文字改变了,但是tr的文字没有改变,就需要重新设置一下[ui.setText(tr("aaa");] // m_updateTrText(); } else { QWidget::changeEvent(e); } } void QtWidgetsApplication1::change1() { trans.load(":/Translation_zh_CN.qm"); qApp->installTranslator(&trans); mySetUiText(); } void QtWidgetsApplication1::change2() { trans.load(":/Translation_en.qm"); qApp->installTranslator(&trans); mySetUiText(); } void QtWidgetsApplication1::mySetUiText() { ui.label->setText(tr("text")); ui.pushButton->setText(tr("zhongwen")); ui.pushButton_2->setText(tr("yingwen")); ui.pushButton->setToolTip(tr("zhongwen")); ui.pushButton_2->setToolTip(tr("yingwen")); }