Меню модели дерева 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 с меткой делегата, показывающей описание MenuObjects с q_property:

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");
}

Но я НЕ МОГУ заставить переводы работать для элементов в древовидной модели. Любая помощь приветствуется.


person Vegard H    schedule 18.08.2020    source источник
comment
Почему бы вам не использовать модель вместо QQmlListProperty? Модели изначально поддерживают обработку изменения данных и т. д.   -  person folibis    schedule 18.08.2020
comment
Проблема не в изменении данных. Проблема заключается в переводе всего, что в нем содержится, на разные языки на лету.   -  person Vegard H    schedule 18.08.2020
comment
Также я пытался использовать только MenuObject, выставленный как q_property напрямую, без изменения текста при повторном переводе с помощью qmlengine.   -  person Vegard H    schedule 18.08.2020


Ответы (1)


Если ваша description опора никогда не запускает обновленный сигнал, ваш пользовательский интерфейс никогда не обновит его.

Причина, по которой это работает для Q_PROPERTY(QString header READ getHeader NOTIFY listChanged);, заключается в том, что предположительно сигнал listChanged() запускается каждый раз, когда предполагается, что header также изменится.

Чтобы исправить это, вам нужно объявить соответствующий сигнал NOTIFY для вашего description, и, конечно же, это уже не CONSTANT.

person user268396    schedule 18.08.2020
comment
Вы говорите, что Qproperty объекта MenuObject должен быть переделан как: Q_PROPERTY (описание QString READ getDescription NOTIFY descriptionChanged); Но что вызывает уведомление? Я попытался подключить это к переводчикам, испускающим сигнал languageChanged, и он действительно уведомляет, но, увы, текст не переводится. - person Vegard H; 18.08.2020