记录下使用QListView遇到的各种问题
QListView可以用来以列表的形式展示数据,在Qt中使用model/View结构来管理数据与视图的关系,model负责数据的存取,数据的交互通过delegate来实现。
添加数据模型
QT提供了一些现成的models用于处理数据项:
QStringListModel 用于存储简单的QString列表。
QStandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据。
QDirModel 提供本地文件系统中的文件与目录信息。
QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来访问数据库。
使用Qt自带的模型类QStandardItemModel即可。模型中的每个数据项都有一个与之对应的role来存储某一类数据。需要存取自定义数据可以使用UserRole,UserRole+1...
对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。
struct ItemData{
QString name;
QString tel;
};
Q_DECLARE_METATYPE(ItemData)
单一数据存取
//存
Item->setData(itemStatus,Qt::UserRole); // 单一存取
//取
ItemStatus status = (ItemStatus)(index.data(Qt::UserRole).toInt());
结构体数据存取
//存
Item->setData(QVariant::fromValue(itemData),Qt::UserRole+1);//整体存取
//取
QVariant variant = index.data(Qt::UserRole+1);
ItemData data = variant.value();
自定义delegate
模型的交互和绘制通过自定义delegate来实现,暂时没用到交互,先说下item的绘制。继承了QStyledItemDelegate后,重写paint函数处理item的样式,以及sizeHint函数返回item的大小:
绘制item
void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(index.isValid())
{
painter->save();
ItemStatus status = (ItemStatus)(index.data(Qt::UserRole).toInt());
QVariant variant = index.data(Qt::UserRole+1);
ItemData data = variant.value();
QStyleOptionViewItem viewOption(op