为QML ListView

时间:2017-04-27 21:41:26

标签: c++ qt qml

我正在尝试使用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。这是不是很好的做法?

总结一下我的问题,我有这些问题:

  • 如何将int转换为QModelIndex以在setData()中使用。
  • 我是否还必须重新实现flags()以获得可编辑的模型。如果是这样,怎么样?
  • 将setData()的第二个参数更改为我的选择之一是个好主意吗?如果没有,我如何将我的班级转换为QVariant?

如果可能的话,我还想要一个我可以使用QML进行QAbstractListModel进一步研究的来源。

编辑:删除了其他问题,因为它不在主题上。

0 个答案:

没有答案