我有一个存储和编辑笔记的应用程序。注释列表显示在列表视图中,如下所示:
Page {
id: noteList
title: i18n.tr("QNote")
visible: false
Column {
anchors.fill: parent
ListView {
anchors.fill: parent
model: notes
delegate: ListItem.Standard {
text: Title
onClicked: editNote(NoteText, Title, modelData);
progression: true
}
}
}
}
function editNote(text, title, item) {
pageStack.push(noteEdit, {title: title, text: text});
handler.setActiveItem(item);
}
notes项是一个NoteListModel,它是QAbstractListModel的子类,并且包含NoteListItems。我想做的是存储当前选择的NoteListItem,这样当用户希望保存修改后的笔记时,我就可以轻松地访问其中的Note对象。但是,我不知道如何从qml委托访问后台NoteListItem。modelData似乎是另一回事。有什么办法吗?如果我可以在QVariant中包装Note对象,我可以通过角色轻松访问它,但是当我这样尝试时
QVariant NoteListItem::data(int role) {
switch (role) {
case Title:
return note.getTitle();
case NoteText:
return note.getText();
case NoteObject:
return QVariant::fromValue(note);
default:
return QVariant();
}
}
导致编译器错误说
qmettype .h:642:错误:无效的sizeof应用于不完整的QStaticAssertFailure类型
或者我应该尝试从后台代码访问选定的列表项?有什么办法吗?你有什么主意吗?
谢谢你的时间。问候,彼得。
这花了我很长时间才找到,因为在Stackoverflow上有许多不正确的解决方案。
纯QML方式是使用DelegateModel
并从QML访问它,如下所示:
import QtQuick 2.4
import QtQml.Models 2.1
ListView {
property var currentSelectedItem
onCurrentItemChanged{
// Update the currently-selected item
currentSelectedItem = myDelegateModel.items.get(currentIndex).model;
// Log the Display Role
console.log(currentSelectedItem.display);
}
model: DelegateModel {
id: myDelegateModel
model: myAbstractItemModel
delegate: {
// Define delegates here
}
}
}
这一行返回一个对象(var
),你可以像在委托中一样访问它:myDelegateModel.items.get(currentIndex).model
这个例子假设你只使用默认的DelegateModelGroup。
见http://doc.qt.io/qt-5/qml-qtqml-models-delegatemodel.htmlhttp://doc.qt.io/qt-5/qml-qtqml-models-delegatemodelgroup.html#get-method方法