如果要实现qt程序动态语言切换,最简单有效的方法是使用QTranslator类,首先使用QTranslator对象加载相应的翻译语言文件,然后用 QApplication::installTranslator 为程序装载翻译器,后续如果想更改语言,将旧的翻译器移除,添加新的加载相应语言文件的翻译器即可。
我在刚开始写动态语言切换程序的时候,使用connect函数连接信号槽
connect (combox, SIGNAL(currentIndexChanged(int)),this, SLOT(languageCBoxChanged()));
Combox中存放的是不同的语言标签,可以通过combox中选项来选择不同语言,当combox中的选项发生变化时会产生currentIndexChanged(int)信号,然后调用与该信号关联的languageCBoxChanged()槽函数,在槽函数中,我进行了translator的替换。
void Widget::languageCBoxChanged()
{
translator = new QTranslator(qApp);
switch(combox->currentIndex())
{
case 0:
qApp->removeTranslator(translator);
qDebug() << "Chinese";
translator->load(":/ipcfg.qm");
qDebug() << "right";
break;
case 1:
qApp->removeTranslator(translator);
qDebug() << "English";
translator->load(":/ipcfg_english.qm");
qDebug() << "right";
break;
case 2:
qApp->removeTranslator(translator);
qDebug() << "Korean";
translator->load(":/ipcfg_ko.qm");
qDebug() << "right";
break;
}
qApp->installTranslator(translator);
this->retranslate();
}
在上面的函数中,在我替了translator之前,已经绘制好的窗体中与语言相关的控件已经装载了旧的translator加载的翻译文件,替换之后,要想使新的翻译文件在旧的窗体中与语言相关的控件上生效,则需要重新设置与语言相关的控件,这个过程,我放到了retranslate()中进行,如下
void Widget::retranslate()
{
label_fineName->setText(tr("NO File!"));
button_Read->setText(tr("Load"));
button_Exit->setText(tr("Exit"));
button_Save->setText(tr("Save"));
button_Ipcfg->setText(tr("Card"));
combox->setItemText(0,tr("Chinese"));
combox->setItemText(1,tr("English"));
combox->setItemText(2,tr("Korean"));
this->setWindowTitle(tr("Network settings"));
}
在languageCBoxChanged槽函数中在加载完新的translator之后,我使用this->retranslate()手动更新了与语言相关的控件,后来通过学习发现完全没必要手动调用this->retranslate(),因为在QApplication::installTranslator装载新的translator之后,程序会发送QEvent::ChangeLanguage这个事件,因此我完全可以在主窗口中捕捉这个事件,然后重写该事件,并在事件函数中对所有与语言相关的控件再重新设置一遍即可,这样就避免了我在写程序时,只要更改translator就需要调用this->retranslate()的问题,下面是我重写后的事件函数:
void Widget::changeEvent(QEvent* event)
{
if(event->type() == QEvent::LanguageChange) {
this->retranslate();
} else
QWidget::changeEvent(event);
}
以上代码是在不使用ui文件绘制窗体的情况,但是如果使用了ui文件,如何切换ui文件中与语言相关的控件呢,其实,ui本身就提供了重置控件的方法this->ui->retranslateUi(this);
于是我们的事件函数可以这样写:
void Widget::changeEvent(QEvent* event)
{
if(event->type() == QEvent::LanguageChange) {
this->retranslate();
this->ui->retranslateUi(this);
} else
QWidget::changeEvent(event);
}
下面附上这个代码:
1 MyMainWindow.pro
#-------------------------------------------------
#
# Project created by QtCreator 2016-08-17T16:33:10
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = myMainWindow
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
TRANSLATIONS += mainwindow_zh.ts mainwindow_en.ts
RESOURCES += \
myResources.qrc
2 mywindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTranslator>
#include <QApplication>
#include <QAction>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void retranslate();
private slots:
void on_comboBox_currentIndexChanged(int index);
private:
QAction *openAction;
QTranslator *translator;
Ui::MainWindow *ui;
void changeEvent(QEvent *event);
};
#endif // MAINWINDOW_H
3 MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QAction>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
translator = new QTranslator(0);
translator->load(":/language/mainwindow_zh.qm");
qApp->installTranslator(translator);
openAction = new QAction(tr("&Open"), this);
QIcon icon(":/myImages/images/fileopen.png");
openAction->setIcon(icon);
openAction->setShortcut(QKeySequence(tr("Ctrl+O")));
ui->menuFile_F->addAction(openAction);
ui->comboBox->addItem(tr("Chinese"));
ui->comboBox->addItem(tr("English"));
// connect(ui->comboBox, SIGNAL(currentIndexChanged(int)),this,SLOT(on_comboBox_currentIndexChanged(int)));
// this->ui->retranslateUi(this);
// this->retranslate();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::retranslate()
{
ui->comboBox->setItemText(0, tr("Chinese"));
ui->comboBox->setItemText(1, tr("English"));
openAction->setText(tr("&Open"));
}
void MainWindow::changeEvent(QEvent* event)
{
if(event->type() == QEvent::LanguageChange) {
this->retranslate();
this->ui->retranslateUi(this);
} else
QWidget::changeEvent(event);
}
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
translator = new QTranslator(qApp);
switch(index)
{
case 0:
qApp->removeTranslator(translator);
qDebug() << "Chinese";
translator->load(":/language/mainwindow_zh.qm");
break;
case 1:
qApp->removeTranslator(translator);
qDebug() << "English";
translator->load(":/language/mainwindow_en.qm");
break;
}
qApp->installTranslator(translator);
// this->ui->retranslateUi(this);
// this->retranslate();
}
4 main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
源代码下载地址: 请点击这里