我有一个存储和编辑笔记的应用程序。笔记列表显示在列表视图中,如下所示:
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似乎是别的东西。有没有办法这样做?如果我可以将Note对象包装在QVariant中,我可以通过角色轻松访问它,但是当我像这样尝试它时
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();
}
}
导致编译错误
qmetatype.h:642:错误:'sizeof'无效应用于不完整类型'QStaticAssertFailure'
或者我应该尝试从支持代码访问所选列表项?那有什么办法吗?你还有什么想法吗?
感谢您的时间。问候, 彼得
答案 0 :(得分:6)
这花了我很长时间才发现,因为Stackoverflow上有许多不正确的解决方案。
纯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
}
}
}
并从QML访问它,如下所示:
var
此行返回一个对象(myDelegateModel.items.get(currentIndex).model
),您可以使用与委托中相同的方式访问该对象:
{{1}}
此示例假定您仅使用默认的DelegateModelGroup。
参见http://doc.qt.io/qt-5/qml-qtqml-models-delegatemodel.html 和http://doc.qt.io/qt-5/qml-qtqml-models-delegatemodelgroup.html#get-method方法