2017-07-18 23 views
0

由于Qt的5.6我们终于可以写出这样的代码:有没有办法如何将QAbstractItemModel的行函数自动公开到QML?

ListView { 
    id: list 
    model: MyModel 
    delegate: TextInput { 
     text: display 
     onEditingFinished: { 
       model.edit = displayText 
     } 
} 

model.edit将调用MyModelsetData()与来自TextInputQt::EditRole和显示值。很好,很久很头痛。

但是,即使使用QAbstractItemModelthe recommended practice更复杂的基于C++的模型,我仍然觉得它只是只读模型,即qml视图可以读取行数,列数等,但它绝不意味着添加或删除行的方式(为了清洁实现QAbstractItemModel::setData该行必须已经存在)。

用Q_INVOKABLE重新实现所有插入/删除功能,qml的ListModel对于任何严重的事情来说都太简单了。

对于基于qml的小部件,应该添加/删除行,编辑项目还有C++模型?

+2

[在QML/QT 5.7中添加和删除C++列表中的项目]的可能重复(https://stackoverflow.com/questions/41617677/adding-and-removing-items-from-ac-list-in- qml-qt-5-7) –

+1

我建议使用通用对象模型,它不绑定到任何特定的数据模式,而且功能非常强大且灵活。通过这种方式,您可以完全避免为每个特定目的模型继续实施C++模型:https://stackoverflow.com/questions/35160909/how-to-create-a-generic-object-model-for-use -in-qml/35161903#35161903 – dtech

回答

1

重新实现了新的QAbstractListModelQAbstractItemModel子类insertRows()removeRows()脏,这是正常的!

请注意,insertRows()removeRows()在基类中标记为virtual,表明这一点。

基类不知道如何操作您的数据结构,因为它可能是QList,或者它可能比SQL数据库或第三方库更复杂。

在您的班级定义中,您可以将方法标记为Q_INVOKABLE或公开位置。还要注意,Qt模型类中的几个函数 - virtual和非 - 都是已经标记为可调用的,参见例如。 here

+0

当然,这些功能应该被覆盖。但是你不能直接从QML调用它们,你可以吗(想象你想要指定QModelIndex与默认值不同)。所以你最终得到一个调用setData()和/或insertRows()的包装器。 –

+1

QML当前没有任何视图项能够显示分层或基于树的模型,因此不应该有任何需要将QModelIndex参数设置为默认以外的任何其他参数....当然,您是对的,这些模型起源于窗口小部件。现在有大量的工作要重新完成整个QML模型 - 视图交互,以期在Qt Quick 2中最终提供一个新的更快的QML TableView。您可以在这里看到它的进展:http://code.qt.io /cgit/qt/qtdeclarative.git/log/?h=wip/itemviews –

+1

嗯,有['TreeView'](https://doc.qt.io/qt-5/qml-qtquick-controls-treeview。 HTML)在Qt快速控制1 – GrecKo

0

我建议你重写insertRows()removeRows()方法,它们是Q_INVOKABLE,并采取指数为整数和调用实际insertRows()removeRows()方法。
所以你可以使用widget和qml UI方法。
我认为这不是脏的,因为你只是为不同的使用做好准备,并且覆盖是正常的。

相关问题