2.4 Qt多国语言切换

 如果要实现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();
}

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值