2012-08-05 45 views
3

我想从Qt文档 (您可以在http://qt-project.org/doc/qt-4.8/declarative-modelviews-objectlistmodel.html上获取它)扩展名为“Object ListModel示例”的示例。使用QML更改C++模型

我想添加一个简单的GUI功能:一个菜单项,用于更改模型中第一个数据项的内容 (即名称)。这样的事情:

MenuItem { 
    text: "Item 123" 
    onClicked: { 
    myModel.setProperty(0,"name","Item 123") //this gives me error 
    } 
} 

我能够在QML中创建菜单,但我找不到在模型中进行更改的正确方法。

顺便说一下,setContextProperty和qmlRegisterType(本例中只使用第一个例子,其他例子包括第二个例子)有什么区别。

+0

如果你问一个基本上说“这给我一个错误”的问题,那么你应该包括你得到的_what_错误。只需将任何错误消息直接复制粘贴到问题中即可。 – 2012-08-06 07:02:34

+0

感谢您的回答和评论。我也问过一个更具体的问题[这里](http://stackoverflow.com/questions/12091495/access-items-of-qstandarditemmodel-from-qml),并在所有答案的帮助下,现在我更好地理解了这个问题。请注意,在上述链接中,我已经添加了关于如何从QML更改QStandardItemModel的数据的工作解决方案。那么,在这个问题中,我没有按照需要使用用户角色,但是给定的代码因此对于初学者更加有用。 – meolic 2012-12-19 10:53:08

回答

3

这种模型真的不适合修改。视图无法通知变化。更好的选择是使用化QAbstractItemModel:http://qt-project.org/doc/qt-4.8/declarative-modelviews-abstractitemmodel.html

更简单的方法来使用化QAbstractItemModel是通过QStandardItemModel:http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html

setContextProperty()将单个命名属性上下文。 qmlRegisterType()用QML引擎注册一个QObject派生类型,允许它实例化该类型。例如,QDeclarativeItem类型在引擎中注册为“Item”,当QML代码中出现Item {}时,引擎如何知道要创建什么。

+0

现在,我也尝试使用Qt文档中的“AbstractItemModel Example”。但我得到完全相同的错误:** TypeError:表达式'myModel.setProperty'[undefined]的结果不是函数**。 – meolic 2012-08-21 10:24:01

+0

您需要在模型中实现setProperty()插槽。 – MartinJ 2012-08-22 09:32:43

+1

谢谢。我决定去QStandardItemModel。但是我仍然没有一个例子就迷失了。如何从QML访问QStandardItemModel项目?是否有另一种(更好的)从QML而不是setProperty()更改数据的方法? – meolic 2012-08-22 12:02:14