Qt Qml树模型菜单带翻译

问题描述

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

该项目的“数据”是一个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");
}

但是我无法使翻译适用于treemodel中的项目。任何帮助表示赞赏。

解决方法

如果您的description道具从不触发更新的信号,则您的用户界面将永远不会刷新它。

它对Q_PROPERTY(QString header READ getHeader NOTIFY listChanged);起作用的原因是,假定listChanged()也应该发生变化时,就会触发header信号。

要解决此问题,您需要为NOTIFY声明一个合适的description信号,当然,它不再是CONSTANT