gpt4 book ai didi

qt QTranslator 重用

转载 作者:行者123 更新时间:2023-12-04 13:33:45 27 4
gpt4 key购买 nike

我注意到 Qt 文档在翻译的某些方面不是很冗长。我一直在玩弄它,试图通过反复试验来弄清楚他们的行为。最终目标是在运行时更改翻译,但我很困惑 QTranslator 对象在多大程度上可以重用。

考虑一下(其中“a”是应用程序的主要实例):

QTranslator translator;
translator.load("mytranslation_cz");
a.installTranslation(&translator);

(...)

a.removeTranslation(&translator)

现在翻译器已从应用程序中删除,但翻译器对象发生了什么?

在我的测试中,上面的代码又跟了这个
translator.load("mytranslation_fr");
a.installTranslation(&translator);

它在 main() 中没有做任何事情,并且在从其中一个小部件调用时(使用指向主应用程序的指针)使应用程序崩溃。

因此,我怀疑每次要在应用程序中加载的翻译都需要创建一个 QTranslator 对象,并且我无法重用 QTranslator 对象。我的这个假设是对的吗?

作为一个附带问题。假设 QTranslator 对象未被 removeTranslation() 触及,是否可以像这样稍后再次简单地安装它?
QTranslator translator; 
QTranslator translator1;
translator.load("mytranslation_cz");
translator1.load("mytranslation_fr");
a.installTranslation(&translator);
(...)
a.removeTranslation(&translator);
a.installTranslation(&translator1);
(...)
a.removeTranslation(&translator1);
a.installTranslation(&trasnlator); //Will this work?

感谢您的澄清,因为我对在应用程序中安装和删除翻译时 QTranslation 对象会发生什么感到有些困惑,特别是如果 QTranslation 对象可以在运行时以某种方式重复用于多个翻译?

最佳答案

QTranslator::load基本上在简单的意义上可以被认为是一个打开给定.qm的函数。文件,读取所有翻译的值并将其加载为特定语言。

现在在一般操作中,您不希望将它重用于许多语言,因为通过“重用”(即使它允许)您增加了解析这个给定 .qm 的开销。每次切换 UI 语言时为每种语言创建一个文件,这基本上是您不需要的开销。

您假设创建 QTranslator每种语言都是正确的。至于您的附带问题,是的,您也可以重复使用它。这就是拥有个人 QTranslator 的好处每个翻译的对象。只需调用qApp->removeTranslator()使用当前翻译,然后 qApp->installTranslator()与新的。这样你就可以在你喜欢的时候重用加载的翻译。

我们构造它的方式是通过子类 QApplication并添加2个功能

void Application::CreateTranslators() {
// translators_ is a QMap<QString, QTranslator*>
if (!translators_.isEmpty())
return;
QStringList languages;
languages << "en" << "ar" << "zh";
foreach(QString language, languages) {
QTranslator* translator = new QTranslator(instance());
translator->load(language);
translators_.insert(language, translator);
}
}

现在这个函数在应用程序的一开始就被调用。

第二个功能如下
void Application::SwitchLanguage(QString language) {
// current_translator_ is a QTranslator*
if (current_translator_)
removeTranslator(current_translator_);

current_translator_ = translators_.value(language, nullptr);
if (current_translator_)
installTranslator(current_translator_);
}

就是这样。使用第二个功能,您可以在运行时随意切换您的语言。

您还需要注意的几件事正在发生变化 QTranslator在运行时将更新您的 .ui 中的所有翻译。自动标记为可翻译的文件字符串,但是从代码中设置的那些不会。为此,您必须覆盖 QWidget::changeEvent()然后检查事件是否为 QEvent::LanguageChange 类型然后为 QWidget 设置所需的字符串相应地(这样做时不要忘记 tr())

关于qt QTranslator 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15542887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com