Модель списка, унаследованная от 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.