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();}
源代码下载地址: 请点击这里
- 2.4 Qt多国语言切换
- Qt实现多国语言切换
- Qt实现多国语言动态切换
- QT实现多国语言的动态切换
- QT实现多国语言的动态切换
- Qt 界面实现多国语言的切换实例
- Qt多国语言的实现与切换(国际化)
- QT实现多国语言的动态切换
- Qt 界面实现多国语言的切换实例
- QT实现多国语言的动态切换
- Qt多国语言的实现与切换(国际化)
- Qt多国语言的实现与切换(国际化)
- QT多国语言动态切换常见例子
- Qt 多国语言
- 可切换多国语言
- Qt多国语言国际化
- Qt 多国语言国际化
- Qt实现多国语言(即界面翻译)可实时进行切换
- SQL ROW_NUMBER() OVER函数的基本用法
- 孤儿进程&僵尸进程&守护进程【详细实例总结】
- node.js包的发布
- Codeforces 344C Rational Resistance【思维+贪心】
- A browser pop-up bloker is detected.Please allow the pop-up for this site
- 2.4 Qt多国语言切换
- java抓取数据包查询12306余票信息
- SQL中的case when then else end用法
- Atom安装文档
- javascript_基础整理
- maven 指定pom.xml 启动
- hql查询日期时间段及时区问题
- node.js debug调试
- javascript自定义对象