qt中英文切换涉及到一个软件两个文件,分别是QtLinguist、.ts文件和.qm文件。
1、在Pro中添加
TRANSLATIONS += en.ts \
ch.ts
添加这个文件后qmake,然后如下操作点击更新:
这个时候会生成2两个文件en.ts和ch.ts。
2、将这两个文件添加到项目中方便修改。
3、这个时候我们可以在工程中进行准备工作了。
首先把代码中除.ui文件外的所有中文使用tr()括起来,使Qt Linguist能够识别到。
然后如下操作
使用QtLinguist方式打开。
找出所有需要翻译的中文,在下面输入栏中进行翻译。
翻译后点击以下操作进行确定。
然后点击保存。
最后如下进行发布。
发布后会生成两个.qm文件。
将文件放在执行文件同级目录,方便后面进行加载。
4、加载qm文件实时切换中英文。
void Widget::on_pushButton_clicked()
{
qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/en.qm");
qApp->installTranslator(m_translator);
ui->retranslateUi(this);
}
void Widget::on_pushButton_2_clicked()
{
qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/ch.qm");
qApp->installTranslator(m_translator);
ui->retranslateUi(this);
}
这步完成后基本上只有主页在.ui文件中的控件可以实时中英文切换,但是还有很多切换没有成功。
4、这个时候有其它场景的中英文切换如下。
场景1:UI文件中的控件翻译,其它页面的.ui需要进入事件来进行配置。如下
void Form::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange){
this->ui->retranslateUi(this);
}
}
场景2:主页和其它页非.ui文件中的控件(控件为成员对象时)
void Form::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange){
this->ui->retranslateUi(this);
ui->label->setText(tr("你好"));
ui->label_3->setText(tr("测试2"));
}
}
跟上面是不是很像,没错就是大部分一样,但是
this->ui->retranslateUi(this);
它只能修改.ui中的中英文,非.ui的需要自己来加载。
场景3:主页和其它页非.ui文件中的控件(控件为局部对象时)
这个就是控件在函数里面创建,翻译方法如下:
Form2::Form2(QWidget *parent) :
QWidget(parent)
{
QLabel* lab = new QLabel(tr("武汉加油"),this);
lab->setGeometry(0,0,120,20);
QPushButton* btn = new QPushButton(tr("武汉加油"),this);
btn->setGeometry(0,30,120,20);
}
Form2::~Form2()
{
}
void Form2::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange){
QList<QLabel *> labs =this->findChildren<QLabel *>();
foreach (QLabel *lab, labs)
{
lab->setText(tr("武汉加油"));
}
QList<QPushButton *> btns =this->findChildren<QPushButton *>();
foreach (QPushButton *btn, btns)
{
btn->setText(tr("武汉加油"));
}
}
}
以上是介绍实时中英切换的,但是同时存在一个中文版本和一个英文版本是没有这么复杂的,直接加载.qm文件就行了,后面操作基本上都不需要了。
这里还介绍一个更简单的实时切换中英文的方法:
如下:
.cpp文件
void Widget::on_pushButton_clicked()
{
qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/en.qm");
qApp->installTranslator(m_translator);
ui->retranslateUi(this);
qApp->exit();
}
void Widget::on_pushButton_2_clicked()
{
qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/ch.qm");
qApp->installTranslator(m_translator);
ui->retranslateUi(this);
qApp->exit();
}
main.cpp文件:
UMainWindow w;
w.show();
bool ok = a.exec();
f(!ok)
{
QProcess::startDetached(qApp->applicationFilePath(), params);
return ok;
}
这种是通过自动重启来实现的中英文切换。
源码