2.4 Qt多国语言切换

来源:互联网 发布:五大常任理事国 知乎 编辑:程序博客网 时间:2024/04/27 14:01

 如果要实现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 guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = myMainWindowTEMPLATE = appSOURCES += main.cpp\        mainwindow.cppHEADERS  += mainwindow.hFORMS    += mainwindow.uiTRANSLATIONS += mainwindow_zh.ts mainwindow_en.tsRESOURCES += \    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_OBJECTpublic:    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();}

源代码下载地址: 请点击这里

0 0