Модель списка, унаследованная от QAbstractListModel, свойства элемента списка не будут обновляться из QML

Мне трудно объяснить мою проблему, поэтому я просто сделаю ее максимально простой и надеюсь, что она справится со своей задачей. Я использую Qt5 с QtQuick 2.0.

Я создал класс MyListModel, который наследуется от QAbstractListModel и содержит элементы типа MyListItem. Я использую его в QML ListView как model: myListModelи делегат отображает quantity свойство от MyListItem, в прекрасной коробке TextInput. Все отлично работает

Тем не менее, когда я меняю quantity значение от делегата, элементы в модели не обновляются. Я знаю, что они не обновлены, потому что мой setQuantity(long desired_quantity) функция, член MyListItem, не запускается. Короче говоря, я не могу понять, как на самом деле вызвать функцию setQuantity из делегата. Я могу сделать это вручную, добавив Q_PROPERTY(long quantity READ quantity WRITE setQuantity) в MyListItem, а затем с помощью setContextProperty() разоблачить MyListItem myTemp объект в QML, а затем вызов myTemp.quantity = 10, Но ясно, что если делегат не может записать в свойство количества (он может только читать из него), он не выполняет свою работу.

Может ли кто-нибудь указать мне правильное направление? Я чувствую, что перепробовал все, что могли ожидать дизайнеры Qt, и ничего не получил. И я не могу найти какую-либо документацию, которая четко решает мою проблему.

1 ответ

Решение

Поле TextInput не будет обновлять вашу модель C++ автоматически, вы должны сделать это самостоятельно. Вы можете сделать это, добавив слот или метод Q_INVOKABLE к вашей модели:

//add a slot to you model
public slots:
 setDataInModel(const int index, const QVariant &value);
//or add Q_INVOKABLE method:
public:
 Q_INVOKABLE setData(const int index, const QVariant &value);

Вы должны реализовать один из этих методов, чтобы он изменил соответствующую строку данных в вашей модели. Не забудьте вызвать метод dataChanged внутри метода после обновления. Затем вы должны вызвать эти методы из делегата QML вручную при обновлении TextInput:

onAccepted: {
  model.setDataInModel(index, text)
}

Здесь index - это свойство, которое определено в каждом делегате, а text - это текст из вашего TextInput.

Другие вопросы по тегам