Pet*_*ter 5 qt qabstractitemmodel qml qt5
我有一个存储和编辑笔记的应用程序.笔记列表显示在列表视图中,如下所示:
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);
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它导致编译器错误说
qmetatype.h:642:错误:'sizeof'无效应用于不完整类型'QStaticAssertFailure'
或者我应该尝试从支持代码访问选定的列表项?那有什么办法吗?你有什么想法吗?
谢谢你的时间.问候,彼得
这花了我很长时间才找到,因为Stackoverflow上有许多不正确的解决方案.
纯QML方式是使用a 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
该行返回一个对象(var),您可以使用与委托中相同的方式访问该对象:
myDelegateModel.items.get(currentIndex).model
此示例假定您仅使用默认的DelegateModelGroup.
请参阅http://doc.qt.io/qt-5/qml-qtqml-models-delegatemodel.html 和http://doc.qt.io/qt-5/qml-qtqml-models-delegatemodelgroup.html#get -方法