Qt QAbstractTableModel的使用以及在QML下调用

最近有个需求,就是在QML中显示一个表格, 表格中显示一些字符,此外还需要显示数值和图形(圆形图像不同颜色代表true/false)。网上找了很多内容发现不是很适用,好多都是适用widget适用C++来做表格。但是widget做的在QML下使用感觉又有点问题(widget使用paint渲染, 但是QML使用的是scense graph,使用QSGNode)。那还是用QAbsractTableMode来用C++实现Model, 而在QML下使用TableView,把显示和数据分开处理。

对于使用QAbstractTableMode, 网上有比较多的介绍。下面这个是写的不错的: 

https://blog.csdn.net/qq411633267/article/details/80817275

根据这篇,在C++部分,实现了下面的几个函数,分别是: 

columnCount(const QModelIndex &parent) const; 返回表格的列数

rowCount(const QModelIndex &parent) const; 返回表格的行数;

QVariant data(const QModelIndex &index, int role) const; 根据index和role来返回表格数据;

QHash<int, QByteArray> roleNames() const; 返回roles;

在创建Model时, 创建一个QStringList, 设置几个roles。每一列设置一个role。

在QML中,TableView下使用: 

TableViewColumn{role: "rolename"; title:"Title"; width: xx }

使用这个设置TableView的一列,其中的role成员需要和C++部分创建的QStringList设置的role相匹配。 

在Model创建后,使用setContextProprty设置,然后在TableView中,直接赋值给model成员。 

在QML中, 通过rowDelegate设置每一行的显示;

通过itemDelegate, 设置每一个单元格的显示, 这里涉及到一个如何拿到单元格里面的数据(内容), 使用styleData.value就可以拿到单元格的内容。 

在单元格里显示图片(图形),可以根据单元格内容来给对应变量赋值。 (将图片地址赋值给Image的source成员)

如果需要表格里的数据根据实际的信号状态或者信号值进行变化。 那么在C++部分,修改对应的数据(某行,某列)然后发送dataChanged消息;

emit dataChanged(index(0,3), index(0,3)); 根据dataChanged消息参数描述, 第一个为左上坐标, 第二个为右下坐标。如果我只想让第一行,第四列的数据进行刷新, 那么就赋值参数index(0,3), index(0,3)。 (行列索引数据是从0开始计数)

发布了11 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/gsymichael/article/details/103886599