【问题标题】:Qt Qml tree model menu with translations带有翻译的 Qt Qml 树模型菜单
【发布时间】:2020-08-18 07:44:07
【问题描述】:

我正在尝试制作一个在大型树模型菜单结构中实时翻译文本的应用程序,方式与:https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/itemviews/simpletreemodel?h=5.15

item 的“数据”是一个 QString,翻译如下:

root = new MenuObject(tr("Main menu"));

子元素的附加如下:

root->appendChild(new MenuObject(tr("Test 1")))
    .appendChild(new MenuObject(tr("Test 2")))

我正在使用 QML 来显示这些,使用 qmllistpoprerty 来显示这些菜单,例如:

Q_PROPERTY(QQmlListProperty<MenuObject> list READ getList NOTIFY listChanged);

QML 是一个简单的 ListView,带有一个委托标签,显示带有 q_property 的 MenuObjects 的描述:

Q_PROPERTY(QString description READ getDescription CONSTANT);

要更改语言,我正在使用将翻译文件导入翻译器的函数,然后是:

installTranslator(translator);
engine.retranslate();

现在这确实适用于简单的 q_properties,例如:

Q_PROPERTY(QString header READ getHeader NOTIFY listChanged);

在哪里

QString MainMenu::getHeader(){
    return tr("Header");
}

但我无法让翻译适用于树模型中的项目。任何帮助表示赞赏。

【问题讨论】:

  • 为什么不用模型而不是QQmlListProperty?模型最初支持数据更改处理等。
  • 问题不在于更改数据。问题在于将其中的任何内容即时翻译成不同的语言。
  • 我也尝试过直接暴露为 q_property 的 MenuObject,而不会在使用 qmlengine 重新翻译时更改文本。

标签: c++ qt qml qt-linguist


【解决方案1】:

如果您的 description 道具从未触发更新信号,那么您的 UI 将永远不会刷新它。

它适用于Q_PROPERTY(QString header READ getHeader NOTIFY listChanged); 的原因可能是因为每当header 也应该改变时,listChanged() 信号就会被触发。

要修复它,您需要为您的description 声明一个适当的NOTIFY 信号,当然它不再是CONSTANT

【讨论】:

  • 你是说MenuObject的Qproperty应该重做为:Q_PROPERTY(QString description READ getDescription NOTIFY descriptionChanged);但是什么触发了通知?我尝试将其连接到翻译器发出的信号“languageChanged”,它确实会发出通知,但可惜文本没有被翻译。
猜你喜欢
  • 1970-01-01
  • 2018-05-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
相关资源
最近更新 更多