QListView实现自定义Item

当QListView需要展示复杂内容时,不能直接使用setItemWidget。本文介绍如何通过继承QStyledItemDelegate,重写paint和sizeHint函数,实现自定义Item。首先定义一个结构体作为item数据,然后创建自定义ItemDelegate,调整paint函数以达到所需效果,并通过QListView处理点击事件,最终实现自定义的显示效果。
摘要由CSDN通过智能技术生成

一般情况下QListView中的元素可以用QStandardItem表示,但对与一些想要展示复杂内容的情况,QListView并不能向QListWidget一样直接调用setItemWidget实现,需要采用其他方法实现。

为QStandardItem修改QStyledItemDelegate实现自定义Item

QStyledItemDelegate类主要用于为 Model-View 中的数据项提供显示和编辑功能。其在绘制数据项时会调用paint进行渲染。因此可以通过重写paint函数就可以实现自定义数据。

首先自定义一个结构体并完成注册,之后就可以作为item数据 

typedef struct {
    QString iconPath;
    QString title;
    QString subTitle;
    QString content;
    QString time;
} MyItemData;

Q_DECLARE_METATYPE(MyItemData)

之后创建自己的ItemDelegate并继承自QStyledItemDelegate并重写其paint函数

#ifndef UI_WIDGETS_MY_LISTVIEW_ITEM_H_
#define UI_WIDGETS_MY_LISTVIEW_ITEM_H_

#include <QStyledItemDelegate>

class QPainter;
class QWidget;
class QItemDelgate;
class QListView;

namespace ui {

class MyItemDelegate : pub
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现在 QListview 中实时显示自定义数据,你需要做以下几个步骤: 1. 创建一个自定义的数据模型,继承自 QAbstractListModel。 2. 在模型中实现必要的函数,如 rowCount(),columnCount(),data() 等。 3. 在你的界面中创建一个 QListview 控件,并将数据模型设置为其模型。 4. 在需要更新数据的地方,调用数据模型中的数据更新函数,比如 setData()。 5. 当数据更新时,会自动触发模型的数据变更信号 dataChanged(),从而更新 QListview 中的数据。 下面是一个简单的示例代码,演示如何实现在 QListview 中实时显示自定义数据: ```c++ // 自定义数据模型 class MyModel : public QAbstractListModel { public: MyModel(QObject *parent = nullptr) : QAbstractListModel(parent) {} int rowCount(const QModelIndex &parent = QModelIndex()) const override { return m_data.size(); } QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { if (!index.isValid() || index.row() >= m_data.size()) return QVariant(); if (role == Qt::DisplayRole) return m_data.at(index.row()); return QVariant(); } bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override { if (index.isValid() && role == Qt::EditRole) { m_data.replace(index.row(), value.toString()); emit dataChanged(index, index); return true; } return false; } void addData(const QString &value) { beginInsertRows(QModelIndex(), rowCount(), rowCount()); m_data.append(value); endInsertRows(); } private: QStringList m_data; }; // 在界面中使用 MyModel *model = new MyModel(this); ui->listView->setModel(model); // 更新数据 model->addData("item 1"); model->setData(model->index(0), "new item 1"); ``` 在这个示例中,我们创建了一个自定义数据模型 MyModel,重载了 rowCount(),data() 和 setData() 等函数。在界面中,我们创建了一个 QListview 控件,并将其模型设置为 MyModel。在需要更新数据时,我们调用 MyModel 中的数据更新函数,比如 addData() 和 setData(),从而实现了在 QListview 中实时显示自定义数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值