我正在尝试使用QAbstractListModel为QML中的ListView创建一个可编辑的模型。由于它在Qt Documentation中声明,我尝试为我的模型实现setData(),但我遇到了几个问题。
setData()成员函数定义如下:
bool setData(const QModelIndex &index, const QVariant &value, int role)
但是,在我的ListView委托中,我有这样的东西:
MouseArea
{
anchors.fill: parent
onClicked: elementClicked(index)
}
是否有正确的方法将索引转换为QModelIndex以在setData()中使用它?我尝试用这个来制作QModelIndex:
void MainWindow::onElementClicked(int index)
{
AbstractItem x = mListModel.getItem(index); //Getting AbstractItem at specific index...
x.setStatus(); //Changing a boolean value of AbstractItem
QModelIndex idx = MIListModel.index(0, index, QModelIndex()); //using 0, since the ListView only has 1 row.
qDebug() << index;
MIListModel.setData(idx, x, Qt::EditRole); //...and then trying to pass it in setData() to replace the original one.
qDebug() << "OK";
}
但是setData()总是返回false。使用 qDebug()&lt;&lt; index.row()和 qDebug()&lt;&lt;在setData()中的index.column(),我发现行和列的值都是 -1 ,从而导致失败。
另外,我是否必须实现 Qt :: ItemFlags标志(const QModelIndex&amp; index)const ?在Qt Documentation(它与上面的链接相同)中,他们声明需要它,但我没有找到它用于QML的相关示例。
最后,我无法将AbstractItem传递给setData(),因为我得到了这个:
cannot convert argument 2 from 'const QVariant' to 'const AbstractItem &'
with
[
T=AbstractItem
]
要解决此问题,我尝试使用 Q_DECLARE_METATYPE(AbstractItem),但我仍然遇到同样的错误。我可以暂时解决这个问题的唯一方法是将setData()成员函数更改为使用AbstractItem而不是QVariant。这是不是很好的做法?
总结一下我的问题,我有这些问题:
如果可能的话,我还想要一个我可以使用QML进行QAbstractListModel进一步研究的来源。
编辑:删除了其他问题,因为它不在主题上。