Как вставить / удалить / редактировать строки в QAbstractListModel? - PullRequest
0 голосов
/ 19 марта 2020

Итак, у меня была модель QAbstractList - ContactBookModel. Элементы модели представлены классом Contact, который содержит конструктор и поля name и number.

Это сработало, но только просмотр, я не мог его редактировать.

Затем я добавил этот метод:

Q_INVOKABLE bool add(const QString& name, const QString& number);

Если вам нужна реализация:

bool ContactBookModel::add(const QString& name, const QString& number)
{
    try
    {
        if(name.isEmpty() || number.isEmpty())
        {
            return false;
        }
        beginInsertRows(QModelIndex(), rowCount(), rowCount());
        contacts.append(Contact(name, number));
        endInsertRows();
        return true;
    }
    catch(std::exception& e)
    {
        return false;
    }
}

Это работает, я вызываю этот метод из QML и передаю 2 строки из TextFields как параметры.

Но в документации сказано, что мне нужен метод переопределения insertRow().

Хорошо, это должно выглядеть следующим образом:

bool ContactBookModel::insertRow(int row, const QModelIndex &parent = QModelIndex())
{
   beginInsertRows(parent, row, row+1);
   contacts.append(/*what should be here?*/); //contacts is a private field in a ContactBookModel. They have got a QList<Contact> type. 
   endInsertRows();
}

1) Как вы можете видеть, когда я использовал add, я строю Contact в методе, используя для этого два поля. Как это сделать с insertRow()? Где взять (построить) Contact?

2) Как удалить контакт? В документации сказано, что я должен переопределить removeRow(). Как использовать это в QML?

3) Как редактировать контакт из QML?

Полный код проекта здесь: https://github.com/bogdasar1985/ContactBook

1 Ответ

1 голос
/ 19 марта 2020

Вы хотите способ редактирования элементов в модели. Таким образом, вы должны включить кликабельность удаленных ворот. Ваш текущий код не предлагает этого, поэтому добавьте mousearea и выделите signal при нажатии на элемент.

затем вы можете взять значения currentIndex name и number и использовать их в своем addWindow или любое другое окно, которое вы хотите.

import QtQuick 2.0

Item {
    id: contact
    width: parent.width
    height: 30

    signal clicked()

Rectangle {
    id: mainRect
    anchors.fill: parent
    border.color: "black"
    visible: true
    Text {
        id: nameText
        text: name
        anchors.left: parent.left
        anchors.leftMargin: 4
    }
    Text {
        id: numberText
        text: number
        anchors.right: parent.right
        anchors.rightMargin: 4
    }

    MouseArea {
        id: rectMousearea
        anchors.fill: mainRect
        hoverEnabled: true
        acceptedButtons: Qt.LeftButton
        cursorShape: Qt.PointingHandCursor
        onClicked: contact.clicked()
    }
}
}

и затем в Listview делегат

            delegate: Contact{
                onClicked: {
                    addwindow.name = model.name
                    addwindow.number = model.number
                    addwindow.show()
                }
            }

добавьте два псевдонима в начале addWindow.qml

Window {
    id: addwindow
    visible: false
    width: 320
    height: 320
    title: qsTr("Add contact")

    property alias name: nameField.text
    property alias number: numberField.text

не забудьте вернуться в метод add, когда значения name и number совпадают. или вы также можете справиться с этим из qml.

Надеюсь, что это полезно.

...