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