Как установить данные модели из QML?

В C ++ мы можем использовать QAbstractItemModel::setData() для изменения данных модели. Поискав в Интернете, я нашел только, как читать данные из модели, чтобы отобразить их в делегате. Также есть несколько примеров добавления и удаления строк, но я не смог найти, как изменить данные конкретного модельного индекса. Что-то вроде:

Slider {
    onValueChanged: myModel.setData(0, {amount: value})
}

Как я могу изменить данные в модели из QML?


person Uga Buga    schedule 06.08.2015    source источник
comment
Это модель C ++ или чистая модель QML? В последнем случае вы можете использовать _1 _ . Я написал очень простой пример здесь.   -  person BaCaRoZzo    schedule 07.08.2015
comment
Это очень ясно по qt doc. doc.qt .io / qt-5 /.   -  person Crawl.W    schedule 16.04.2019
comment
@ Crawl.W На самом деле документ немного двусмысленно, говоря, что вам нужно явно вызвать setData. Вы этого не сделаете. Вы просто присваиваете новое значение имени роли.   -  person pooya13    schedule 30.11.2020
comment
@ Crawl.W ... setData () метод должен быть явно вызван из делегатов QML ...   -  person pooya13    schedule 02.12.2020
comment
@ pooya13 да, ты прав. Думаю, он может захотеть выразить то, что я имею в виду.   -  person Crawl.W    schedule 02.12.2020


Ответы (1)


В своих проектах я использую другой способ чтения / записи данных из / в модели QML, я просто создаю два файла .qml, один для отображения, а другой - вспомогательный файл для выполнения операций с базой данных, и я создаю модель, наследующую QAbstractItemModel, и добавляю четыре функции к нему:

MyCustomObject * at(int index); // get an item to display

void reload(); // to notify QML view on update/delete

bool insert(MyCustomObject *p_myCustomObject); // insert an item in model or database

bool update(MyCustomObject *p_myCustomObject);// update an item to model or database

bool doDelete(int myCustomObjectID);// delete an item from model or database

затем я создаю локальный объект для чтения / записи, и при отображении этих данных я заполняю значение локального объекта из модели, и когда я хочу сохранить, я записываю этот объект в базу данных

добавьте это свойство в свой основной класс отображения

property MyCustomObject myCustomObject : MyCustomObject{} // to read/write UI value ti/from it

и вот вспомогательный класс, который считывает значения пользовательского интерфейса и вставляет, обновляет или удаляет в / из моделей

Примечание: этот класс предназначен для одного из моих приложений, просто прочтите его и измените в соответствии со своими потребностями.

import QtQuick 2.0
import DOO.Commands.Son 1.0
import DOOTypes 1.0

QtObject {

    // read ui values into local son
    function readUIValues()
    {
        var v_son =  SonFactory.createObject()
        v_son.name = sonName.text
        v_son.image = sonImage.picture
        v_son.age = sonAge.text
        v_son.entryDate = Date.fromLocaleDateString(Qt.locale(), sonEntryDate.text, "dd-MM-yyyy")
        v_son.commingFrom = sonCommingFrom.text
        v_son.disabilityKind.kind = sonDisabilityKind.currentIndex
        v_son.caseDescription = sonCaseDescription.text

        return v_son

    }
    // simple UI validation
    function validateUIValues()
    {
        if(sonName.text == "") return false
        if(sonImage.picture == "") return false
        if(sonAge.text < 1 || sonAge.text > 100) return false
        if(Date.fromLocaleDateString(Qt.locale(), sonEntryDate.text, "dd-MM-yyyy") == "Invalid Date") return false
        if(sonCommingFrom.text == "") return false
        if(sonDisabilityKind.text == "") return false
        if(sonCaseDescription.text == "") return false

        return true
    }

    // save or update a son into database
    function save()
    {

        if (!validateUIValues())
        {
            dooNotifier.showMessage("خطأ","ليدك مدخلات غير صحيحة، يُرجى التأكد من إدخال قيم صحيحة")
            return
        }

        var v_son =  readUIValues()


        if(disMode === DOO.CreateNew)
        {
            if(SonResultsModel.insert(v_son))
            {
                dooNotifier.showMessage("تم بنجاح","تم إضافة الابن بنجاح")
                sonDisplay.hide()
            }
            else
            {
                dooNotifier.showMessage("فشل","فشل إضافة الابن")
                DOOLogger.log(SonResultsModel.lasrErrorText())
            }
        }
        else
        {
            //get the ID of the son bieng edited
            v_son.sonID = son.sonID

            if(SonResultsModel.update(v_son))
            {
                dooNotifier.showMessage("تم بنجاح","تم تحديث الابن بنجاح")
                sonDisplay.hide()
            }
            else
            {
                dooNotifier.showMessage("فشل","فشل تحديث الابن")
                DOOLogger.log(SonResultsModel.lasrErrorText())
            }
        }

        v_son.destroy()
    }

    function doDelete(sonID)
    {
        if(SonResultsModel.doDelete(sonID)) {
            dooNotifier.showMessage("تم بنجاح","تم حذف الابن بنجاح")
            sonDisplay.hide()
        }
        else dooNotifier.showMessage("فشل","فشل حذف الابن")
    }
}

это способ, которым я использую для чтения и записи в / из баз данных, надеюсь, это поможет

person Yasser Sobhy    schedule 06.08.2015