如何从QML设置模型数据?

时间:2015-08-06 15:54:05

标签: c++ qt qml qt5 qabstractitemmodel

在C ++中,我们可以使用QAbstractItemModel::setData()来修改模型的数据。在互联网上搜索我只发现了如何从模型中读取数据以在委托中显示它。还有一些添加和删除行的示例,但我找不到如何更改特定模型索引的数据。类似的东西:

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

如何在QML中修改模型中的数据?

1 个答案:

答案 0 :(得分: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

这是一个帮助器类,它读取UI值并插入,更新或删除模型

注意:此类适用于我的某个应用程序,但只需阅读并修改它以满足您的需求

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("فشل","فشل حذف الابن")
    }
}

这是我用来读写数据库的方式,我希望它有所帮助