本文使用的Qt版本为5.9.9
概述
通常来说翻译文件都是在页面创建之前加载的,但也可以在不重启程序的情况下更改界面的语言。具体实现步骤如下:
- 将翻译文件的加载放在槽函数中进行,通过事件触发来改变。
- 在更改了翻译文件后,需要将程序中所有用户可见的字符串重新设置一遍。
实例
下面以实例来进行说明,界面如下,通过按钮来切换语言。我们需要准备一个翻译文件,将英文页面翻译为中文。完整的实例可以点击此处下载。
在按钮的槽函数中使用qApp->installTranslator来加载翻译文件,使用qApp->removeTranslator来删除翻译文件,因为我们的页面原来就是英文的(代码中使用的英文字符),所以调用removeTranslator删除后就会恢复默认。
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QHBoxLayout *hlayout = new QHBoxLayout();
label = new QLabel(tr("language select:"));
hlayout->addWidget(label);
combo = new QComboBox();
hlayout->addWidget(combo);
ui->verticalLayout->insertLayout(0,hlayout);
combo->addItem(tr("English"));
combo->addItem(tr("Chinese"));
translator = new QTranslator();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
qApp->removeTranslator(translator);
if(combo->currentIndex() == 1) {
//切换为中文
qDebug()<<translator->load("samp16_cn.qm");
qApp->installTranslator(translator);
}
//重新设置用户可见的字符,所有的控件,只要是用户能看到的字符,都要重新设置!
label->setText(tr("language select:"));
combo->setItemText(0,tr("English"));
combo->setItemText(1,tr("Chinese"));
//这个函数是Qt Designer自动生成的,跟上面我们自己写的重新设置控件字符串的函数相同,
//所有通过Designer拖出来的控件,通过调用这个函数就可以重新设置了。
ui->retranslateUi(this);
}
可以看到在更改了translator后,程序中所有控件中用户可见的字符都要重新设置一次,否则不会生效。这种方式的操作极为繁琐,所以在大的项目中都是在更改界面语言后要重启程序才行。