Qt之国际化
Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下。
对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言)。在使用的过程中,我们也不需要重启应用程序而实现语言的动态切换。这样的话,易用性就非常好了。
对用户可见的文本信息全部使用tr()进行封装
提供用户可以用来切换语言的一种方法。
对于每一个窗口部件或者对话框,重写changeEvent事件,当事件类型为QEvent::LanguageChange时,翻译文本进行重新调用(为了简单我把它放在一个单独的函数translateUI()中)。
我们来看一个简单的示例:主界面、设置界面,设置界面可根据选择不同语言下拉选项实现语言的动态切换!
为了简单起见,这里只给出关键代码(源码下载请参考最下面下载地址):
设置界面:setting_dialog.h
language_combo_box- addItem("chinese", QVariant::fromValue(UI_ZH)); language_combo_box- addItem("english", QVariant::fromValue(UI_EN)); qRegisterMetaType LANGUAGE ("LANGUAGE"); connect(language_combo_box, static_cast void (QComboBox::*)(int) ( QComboBox::currentIndexChanged), this, SettingDialog::onIndexChanged); void SettingDialog::changeEvent(QEvent *event) switch (event- type()) case QEvent::LanguageChange: translateUI(); break; default: QDialog::changeEvent(event); void SettingDialog::translateUI() this- setWindowTitle(tr("setting dialog")); info_label- setText(tr("no brothers no programming")); language_label- setText(tr("language")); language_combo_box- setItemText(UI_ZH, tr("chinese")); language_combo_box- setItemText(UI_EN, tr("english")); void SettingDialog::onIndexChanged() LANGUAGE language = language_combo_box- currentData().value LANGUAGE emit switchLanguage(language); }
主界面:MainWidget.cpp
connect(setting_dialog, SettingDialog::switchLanguage, this, MainWidget::switchLanguage); void MainWidget::translateUI() this- setWindowTitle(tr("main widget")); welcome_label- setText(tr("welcome to Qt") + QString("26197884/26188347")); setting_button- setText(tr("setting")); ok_button- setText(tr("ok")); cancel_button- setText(tr("cancel")); void MainWidget::setLanguage(LANGUAGE current_language) this- current_language = current_language; void MainWidget::setTranslator(QTranslator* translator) this- translator = translator; void MainWidget::changeEvent(QEvent *event) switch (event- type()) case QEvent::LanguageChange: translateUI(); break; default: QWidget::changeEvent(event); void MainWidget::switchLanguage(LANGUAGE language) QString language_qm; switch(language) case UI_ZH: language = UI_ZH; language_qm = QString(":/qm/main_widget_zh"); break; case UI_EN: language = UI_EN; language_qm = QString(":/qm/main_widget_en"); break; default: language = UI_ZH; language_qm = QString(":/qm/main_widget_zh"); if(current_language != language) current_language = language; translator- load(language_qm); Util::writeInit(QString("./user.ini"), QString("language"), QString::number(language, 10)); }
main.cpp
LANGUAGE language = UI_ZH; bool is_read = Util::readInit(QString("./user.ini"), QString("language"), language_value); if(is_read) language = (LANGUAGE)language_value.toInt(); if(language == UI_EN) language_suffix = QString("en"); QTranslator translator; translator.load(QString(":/qm/main_widget_") + language_suffix); app.installTranslator( translator); MainWidget main_widget; main_widget.setTranslator( translator); main_widget.setLanguage(language); main_widget.show(); return app.exec(); }
流程:
进入main(),首先加载默认的语言(或最后一次设置的语言),然后显示主界面。
当打开设置界面后,首先加载当前选择的语言,然后通过下拉设置语言选项来进行语言切换(设置界面的switchLanguage信号关联到主界面的switchLanguage槽中),然后将当前的语言进行保存。
语言切换后,首先会进入changeEvent函数,判断当事件类型为QEvent::LanguageChange时,就会执行translateUI函数进行文本重新显示。
注:
Q_DECLARE_METATYPE:如果要使自定义类型或其他非QMetaType内置类型在QVariant中使用,必须使用该宏 。
qRegisterMetaType:如果非QMetaType内置类型要在信号与槽中使用。
添加翻译源为了方便,这里只介绍中、英文之间的切换。
在pro中添加:
相关文章
- QT(2)项目文件介绍
- QT开发:QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection'...
- Qt 事件处理机制-qt源码解读
- 解决qt程序运行时的cannot create Qt for Embedded Linux data directory: /tmp/qtembedded-0出错情形
- 【QT】Qt creator连接MySQL数据库 - 增删改查
- 【QT】Qt使用QJson生成json文件并保存
- 【QT】对于Qt MSVC 2017无法编译的问题解决
- 【QT】Qt 使用MSVC2017找不到编译器的解决办法
- 【应用开发】在Linux下搭建嵌入式Qt交叉编译环境时的笔记(命令记录)
- 基于Qt框架的GUI控制台——qtconsole
- Qt编写的项目作品18-数据导入导出(xls/pdf)及打印示例
- Qt编写自定义控件15-百分比仪表盘
- 自己用纯C++实现简单的QT中信号与槽机制
- 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
- Qt之QEvent
- Qt之生成XML(QXmlStreamWriter)
- Qt之findChild
- Qt error:QtThese QT version are inaccessible
- QT+OpenGL(04)—freetype库的编译
- [已解决]报错: qt.qpa.plugin: Could not load the Qt platform plugin "windows" in "" even though it ...
- qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""
- 详解 QT 源码之 Qt 事件机制原理