快捷搜索:  汽车  科技

qml怎么进行页面切换(QML动态切换语言实时生效不重启程序)

qml怎么进行页面切换(QML动态切换语言实时生效不重启程序)[Skin]最终配置项内容如下要使配置的翻译在重启后也生效 一定会有记录当前语言的配置 方便重启时读取我们采用qt提供的QSettings类来使用配置文件的读取和修改。使用到的接口包括beginGroup、endGroup、setValue、value4个接口

先看实际效果图

qml怎么进行页面切换(QML动态切换语言实时生效不重启程序)(1)

中文界面

qml怎么进行页面切换(QML动态切换语言实时生效不重启程序)(2)

英文界面

配置文件

要使配置的翻译在重启后也生效 一定会有记录当前语言的配置 方便重启时读取

我们采用qt提供的QSettings类来使用配置文件的读取和修改。

使用到的接口包括beginGroup、endGroup、setValue、value4个接口

最终配置项内容如下

[Skin]

SkinName=Solarized

[Language]

Language=zh

翻译文件制作

QWidget对要翻译的字符加上tr 、QObject::tr包起来 或QApplication::translate接口调用。

有时更新翻译存在未识别到的情况 使用QApplication::translate都能达到更新效果

qml使用qsTr包起来

pro文件加上

TRANSLATIONS = \ SiminatorManage_zh.ts \ SiminatorManage_en.ts

使用qt自带的Qt预言家进行更新翻译、人工翻译、发布翻译的基础操作就不详细介绍了

动态加载

基本上和qt差不多 具体代码如下

void QLocalConfig::setLanguage(const QString &curlanguage) { if (curlanguage != m_language) { m_language = curlanguage; emit languageChanged(); qApp->removeTranslator(translator); translator->load(QString(":/Trans/lang_%1/SiminatorManage_%1.qm").arg(curlanguage)); qApp->installTranslator(translator); #if QT_VERSION >= QT_VERSION_CHECK(5 10 0) engine()->retranslate(); #else emit emptyStringChanged(); #endif } }

区别在于以下两点

1 先removeTranslator 再load。复杂项目的话需要遍历翻译文件 因为是实时生效 不重启 所以和以前单纯的QWidget的实现有所差异

2 qt5.10后支持QmlEngine::retranslate 之前版本不支持 不支持时使用qml特性实现

简单举例如下

Text { Text: qsTr("Chinese") LocalConfig.emptyString }

其中LocalConfig通过以下两行代码注册到qml

QLocalConfig LocalConfig(engine.rootContext()); engine.rootContext()->setContextProperty("LocalConfig" &LocalConfig);

qml中emptyString始终为空,在语言被切换时,QLocalConfig会触发emptyStringChanged信号。

当语言被改变时,LocalConfig.emptyString属性的change信号会被触发(发送了emptyStringChanged信号),此时qml引擎会重新对这个表达式求值,按照新的语言返回翻译结果。

Text组件的text属性变化时,会自己刷新UI。就达到了动态翻译的效果。

猜您喜欢: