在C ++中,我们可以使用QAbstractItemModel::setData()
来修改模型的数据。在互联网上搜索我只发现了如何从模型中读取数据以在委托中显示它。还有一些添加和删除行的示例,但我找不到如何更改特定模型索引的数据。类似的东西:
Slider {
onValueChanged: myModel.setData(0, {amount: value})
}
如何在QML中修改模型中的数据?
答案 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("فشل","فشل حذف الابن")
}
}
这是我用来读写数据库的方式,我希望它有所帮助