QML Data Models 数据模型<一>

转载 2012年03月29日 18:48:36

http://blog.csdn.net/ape_neu/article/details/6766273

        在QML中,ListView、GridView、Repeater 需要数据模型提供数据,然后在显示。而如何显示则需要一个代理(delegate)来定义。模型可以是静态的,也能够动态添加删除或修改。delegate可以绑定到model的date roles 。例如:

 import Qt 4.7

 Item {
     width: 200; height: 250

     ListModel {
         id: myModel
         ListElement { type: "Dog"; age: 8 }
         ListElement { type: "Cat"; age: 5 }
     }

     Component {
         id: myDelegate
         Text { text: type + ", " + age }
     }

     ListView {
         anchors.fill: parent
         model: myModel
         delegate: myDelegate
     }
 }


myModel 有两个roles ,type和age,在delegate中Text用到了这两个roles 

Text { text: type + ", " + age }

如果Text自己有type和age属性怎么办?这时我们可以用myModel.type、myModel.age来代替type和age,否则显示的将是Text的属性(property);


先面介绍几种常见的Model

 

QML Data Models


ListModel  roles通过ListElement属性定义

ListElement {
         name: "Apple"
         cost: 2.45
     }

XmlListModel  roles通过XmlRole属性定义

 XmlListModel {
      id: feedModel
      source: "http://rss.news.yahoo.com/rss/oceania"
      query: "/rss/channel/item"
      XmlRole { name: "title"; query: "title/string()" }
      XmlRole { name: "link"; query: "link/string()" }
      XmlRole { name: "description"; query: "description/string()" }
 }

VisualItemModel 可以用QML items ,比如Rectanle,Text作为模型。这种模型包括了数据和代理,所以不需要额外提供delegate


  VisualItemModel {
      id: itemModel
      Rectangle { height: 30; width: 80; color: "red" }
      Rectangle { height: 30; width: 80; color: "green" }
      Rectangle { height: 30; width: 80; color: "blue" }
  }

  ListView {
      anchors.fill: parent
      model: itemModel
  }

下面是本文的重点:C++ Data Models

通过C++为QML提供数据模型是很必要的,在数据量较大或需要实现处理的情况下尤为重要。

1.QSringList

2.QList<QObject*>


QStringList

QStringList  model 有一个modelData roles  。通过modelData提供数据给delegate

 ListView {
     width: 100; height: 100
     anchors.fill: parent

     model: myModel
     delegate: Rectangle {
         height: 25
         width: 100
         Text { text: modelData }
     }
 }
     QStringList dataList;
     dataList.append("Item 1");
     dataList.append("Item 2");
     dataList.append("Item 3");
     dataList.append("Item 4");

     QDeclarativeView view;
     QDeclarativeContext *ctxt = view.rootContext();
     ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));

但需要注意的是,当模型中数据改变时,即QStringList改变,不会自动同步到视图显示,需要我们再一次调用 QDeclarativeContext::setContextProperty() ,重新设定模型。

 

QList<QObject*>

学习过Qt的人都知道,QObject是很多类的基类,如果我们想让我们自己的类能够作为数据模型,使我们自己定义的属性可以在QML中访问,我们可以继承自QObject或其子类。其属性值(你可以通过Q_PROPERTY()宏来定义自己的属性)将作为roles,供delegate使用。

 class DataObject : public QObject
 {
     Q_OBJECT

     Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
     Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
     ...
 };

 int main(int argc, char ** argv)
 {
     QApplication app(argc, argv);

     QList<QObject*> dataList;
     dataList.append(new DataObject("Item 1", "red"));
     dataList.append(new DataObject("Item 2", "green"));
     dataList.append(new DataObject("Item 3", "blue"));
     dataList.append(new DataObject("Item 4", "yellow"));

     QDeclarativeView view;
     QDeclarativeContext *ctxt = view.rootContext();
     ctxt->setContextProperty("myModel", QVariant::fromValue(dataList));
     ...
 ListView {
     width: 100; height: 100
     anchors.fill: parent

     model: myModel
     delegate: Rectangle {
         height: 25
         width: 100
         color: model.modelData.color
         Text { text: name }
     }
 }

Note the use of the fully qualified access to the color property. The properties of the object are not replicated in the model object, since they are easily available via the modelData object.(英文比我说的清楚)

 


 

相关文章推荐

QML负责GUI,C++负责业务逻辑的范例

在declarative目录中,有个minehunt范例,实现了在C++中加载QML界面,并用C++来处理QML界面上的鼠标动作.这种思路和传统的GUI相似,感觉比较顺畅.否则运行一个QML,还要使用...

QML数据模型(Model)

QML数据模型(Model) QML中的ListView,GridView和Repeater等元素需要数据模型来提供要显示的数据.这些元素需要一个为模型中的每一项数据生成一个实例的代理组件(dele...

QML Data Models 数据模型<一>

在QML中,ListView、GridView、Repeater 需要数据模型提供数据,然后在显示。而如何显示则需要一个代理(delegate)来定义。模型可以是静态的,也能够动态添加删除或修改。de...

Django中models数据模型重命名

问题:       今天的工作内容是使用的django的models.py实现定义好的数据表。这本身是一个非常简单的工作,可以从models.py里面定义表结构,django框架就会自动实现ORM把...

CRM的客户数据模型:Siebel Party Data Model (VI)

关于Siebel CRM Thomas Siebel和 Patricia House 在1993成立了Siebel公司。起先由销售自动化产品起家,然后在扩展到更大的CRM市场。在20世纪90年代末,...

解决VS2012中没有ado.net实体数据模型(ADO.NET entity data model)的问题

我使用的是VS2012旗舰版,但是一直在“新建项目”中找不到“ADO.NET实体数据模型” 这个选项,尝试了网络上的各种方法,包括安装entity framework,重置模板,甚至重新安装vs201...

Aerospike-Architecture系列之数据模型(Data Model)

Data Model(数据模型) Aerospike采用无模式(schema-less)数据模型,这意味着存储在库中的数据不符合严格模式。 这提供了你在Aerospike中存储数据的灵活性-数据修改...

Core Data浅谈系列之四 : 数据模型的版本变迁

继上一篇文章末尾提到的,一支队伍可以添加多名球员,不过一名球员只能属于一支队伍中,这分别对应着Core Data中一对多和一对一的属性关系: ...

python-recsys 3 Data model 3 数据模型

pyrecsys数据模型包括:用户(users),物品(items),及其交互。 3.0 Items 使用一个Id和一些metadata创建一个物品(item): from recsys.d...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)