【问题标题】:Change C++ model with QML使用 QML 更改 C++ 模型
【发布时间】:2012-08-05 23:12:17
【问题描述】:

我想扩展 Qt 文档中名为“Object ListModel Example”的示例 (您可以通过http://qt-project.org/doc/qt-4.8/declarative-modelviews-objectlistmodel.html 获取)。

我正在尝试添加一个简单的 GUI 功能:更改内容的菜单项 模型中第一个数据项的(即名称)。像这样的:

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

我可以在 QML 中创建一个菜单,但我找不到正确的方法来更改模型。

顺便说一句,setContextProperty 和 qmlRegisterType 有什么区别(本示例中仅使用了第一个,但许多其他示例包括第二个)。

【问题讨论】:

  • 如果您问的问题基本上是“这给了我一个错误”,那么您可能应该包括 what 您得到的错误。只需将任何错误消息直接复制粘贴到问题中即可。
  • 感谢您的回答和 cmets。我还问了一个更具体的问题here,现在在所有答案的帮助下,我更好地理解了这个问题。请注意,在提到的链接上,我添加了关于如何从 QML 更改 QStandardItemModel 数据的工作解决方案。好吧,我没有在这个问题中使用用户角色,但给定的代码因此对初学者来说更有用。

标签: c++ qml


【解决方案1】:

那种模型真的不适合改装。视图无法收到更改通知。更好的选择是使用 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”,这就是当Item {} 出现在 QML 代码中时引擎知道要创建什么的方式。

【讨论】:

  • 现在,我还尝试使用 Qt 文档中的“AbstractItemModel 示例”。但我得到完全相同的错误:TypeError: Result of expression 'myModel.setProperty' [undefined] is not a function.
  • 您需要在模型中实现 setProperty() 插槽。
  • 谢谢。我决定使用 QStandardItemModel。但是我仍然没有一个例子。如何从 QML 访问 QStandardItemModel 的项目?是否有另一种(更好的)方法可以从 QML 而不是 setProperty() 更改数据?
  • @meolic 只需在模型中添加一个 QINVOKABLE 方法,然后从那里返回您的项目指针(请务必阅读有关 cppOwnership 等的文档,还要注意返回基类 ptr 之类的技巧可能不会工作(你会在 qml 中得到确切的未定义消息),但返回 QObject 指针工作)。
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多