QML之数据模型

QML中动态加载C++数据, 数据的生产使用C++代码,而显示则交给QML去做。

首先继承一个QAbstractListModel类

class WeekModel : public QAbstractListModel { }

这是一个关于获取系统时间,然后把时间传给QML层的类。


#include <QAbstractListModel>
#include <QString>
#include <QVariant>

/*为星期提供数据*/
class WeekModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QString date READ date WRITE setDate NOTIFY dateChanged);
Q_PROPERTY(QString weekday READ weekday WRITE setWeekday NOTIFY weekdayChanged)


public:
WeekModel(QObject *parent = 0);
~WeekModel();

int rowCount(const QModelIndex & parent) const; //获取数组长度
QVariant data(const QModelIndex & index, int role) const;  //如何获取每个数据


signals:
void dateChanged();
void weekdayChanged();


private:
QString m_date;  // 日期
QString m_weekday; // 星期几
};


Q_PROPERTY 一般只对单一的一个变量。

其中 READ WRITE 方法C++实现, QML使用。NOTIFY 方法一般是C++发送,QML端做响应动作。


那么如果如何表示dates(比如10月1号,10月2号,10月3号。。。。),很自然的想到数组,或者List等所以model类要继承一个QAbstractListModel ,

实现2个方法:

int rowCount(const QModelIndex & parent) const; //获取数组长度
QVariant data(const QModelIndex & index, int role) const;  //如何获取每个数据

  在参数中(QModelIndex &index)int row = index.row(),  表示第几个元素, 系统会根据rowCount返回的长度,进行循环一遍, 至此所有的数据被取出来显示在qml中。

例:

int rowCount(const QModelIndex &parent = QModelIndex()) { return 7;} // 表示一周的时间(7天)

QVariant data(const QModelIndex &index, int role = Qt:DisplayRole) 

{

//获取当天的时间 

QDateTime current_date_time = QDateTime::currentDateTime();

  // 根据index 推算要显示的时间

  int addDay = index.row(); /* row is 0~6 here*/

current_date_time.addDays(addDay);

 return current_date_time.toString("yyyy-mm-dd");

}


我们的工作至此完成一半了。

mian函数里注入 

QQmlApplicationEngine engine;

QQmlContext *ctx = engine.rootContext();
ctx->setContextProperty("uiSender", uiSender);


QAbstractItemModel

可使用QAbstractItemModel的子类定义模型.如果有一个复杂的模型无法用其他方式实现,就可以使用这种方式.QAbstractItemModel在发生变化时会自动通知QML视图.

QAbstractItemModel子类向QML暴露的角色可使用QAbstractItemModel::setRoleNames()设置.默认的角色名称由Qt设置:

Qt Role QML角色名称 
Qt::DisplayRole 显示 
Qt::DecorationRole 修饰

下面的应用程序有一个QAbstractItemModel子类模型叫做AnialModel,具有type和size角色.为在QML中访问这些属性调用了QAbstractItemModel::setRoleNames():

 class Animal
 {
 public:
     Animal(const QString &type, const QString &size);
     ...
 };

 class AnimalModel : public QAbstractListModel
 {
     Q_OBJECT
 public:
     enum AnimalRoles {
         TypeRole = Qt::UserRole + 1,
         SizeRole
     };

     AnimalModel(QObject *parent = 0);
     ...
 };

 AnimalModel::AnimalModel(QObject *parent)
     : QAbstractListModel(parent)
 {
     QHash<int, QByteArray> roles;
     roles[TypeRole] = "type";         //添加自己定义的角色或者叫做属性, 供QML使用
     roles[SizeRole] = "size";
     setRoleNames(roles);
 }

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

     AnimalModel model;
     model.addAnimal(Animal("Wolf", "Medium"));
     model.addAnimal(Animal("Polar bear", "Large"));
     model.addAnimal(Animal("Quoll", "Small"));

     QDeclarativeView view;
     QDeclarativeContext *ctxt = view.rootContext();
     ctxt->setContextProperty("myModel", &model);
     ...
这个模型显示在ListView中,代理可访问type和size角色:

 ListView {
     width: 200; height: 250
     anchors.fill: parent

     model: myModel
     delegate: Text { text: "Animal: " + type + ", " + size }   //这边直接使用type 和 size变量了。
 }










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML中,ListView是一种非常常用的QML组件,用于以列表形式展示数据。ListView可以使用不同的数据模型来提供数据,从而实现灵活的数据展示和交互。 以下是几种常见的ListView数据模型: 1. ListModel模型:这是最常用的数据模型之一,它允许我们通过添加项目来动态修改和管理数据。可以通过在ListView外部创建一个ListModel对象,并将该对象作为ListView的model属性来实现。ListModel对象中的每个项目都可以通过属性定义。可以使用JavaScript的API来操作ListModel的项目,如添加、删除、移动等。 2. ArrayDataModel模型:这种数据模型适用于静态数据。在QML中,我们可以使用JavaScript数组来初始化数据,并将该数组作为ListView的model属性值。此模型基于JavaScript数组,并且不允许对数据进行修改。如果需要对数据进行更改,需要先将数组中的数据复制到一个新的数组,然后将新数组作为model。 3. XmlListModel模型:这个模型是XML数据源的绑定模型。它可以从远程或本地XML文件中提取数据,并在ListView中展示。可以在XmlListModel中指定XML文件的路径,然后使用XmlRole来定义需要展示的数据。XmlListModel可以通过一系列XPath表达式来过滤和排序数据。 4. SqlListModel模型:这个模型是用于绑定SQL数据库的数据模型。可以通过指定SQL查询语句来从数据库中获取数据,并在ListView中展示。可以使用roleNames属性来定义在ListView中展示哪些数据。SqlListModel还具有数据过滤和排序功能。 总的来说,QML中的ListView可以使用多种数据模型来展示不同类型的数据。无论是动态数据还是静态数据,XML数据源还是SQL数据库,都可以通过适当选择数据模型来满足个性化的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值