如何从qml访问ListView的当前项目

时间:2013-05-05 22:37:17

标签: qt qml qt5 qabstractitemmodel

我有一个存储和编辑笔记的应用程序。笔记列表显示在列表视图中,如下所示:

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'

或者我应该尝试从支持代码访问所选列表项?那有什么办法吗?你还有什么想法吗?

感谢您的时间。问候, 彼得

1 个答案:

答案 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.htmlhttp://doc.qt.io/qt-5/qml-qtqml-models-delegatemodelgroup.html#get-method方法

相关问题