继承QAbstractListModel,结合QListView

这里想要写一个QAbstractListModel的子类,学习一下如何实例化QAbstractListModel。

QAbstractListModel子类化-CSDN博客

QVariant与自定义类型互转之奇巧淫技_qt 类型转 qvariant-CSDN博客

cpp 复制代码
#pragma once

#include <QStyledItemDelegate>
#include <qmetatype.h>

class QListView;
class WItemDelegate1 : public QStyledItemDelegate
{
	Q_OBJECT

public:
	WItemDelegate1(QListView* parent = nullptr);
	~WItemDelegate1();
	void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
	QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};
cpp 复制代码
#include "WItemDelegate1.h"
#include "qlistview.h"
#include "qpainter.h"
#include "qsqlquerymodel.h"
#include <qdebug.h>
#include "ListModel.h"
WItemDelegate1::WItemDelegate1(QListView* parent)
    : QStyledItemDelegate(parent)
{
}

WItemDelegate1::~WItemDelegate1()
{}
QSize WItemDelegate1::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    return QSize(option.rect.width(), 60);
}
void WItemDelegate1::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if (index.isValid()) {
        int row = index.row();
        QSqlQueryModel* Model = (QSqlQueryModel*)index.model();
        QVariant data = index.data(Qt::DisplayRole);
        WItemData d = data.value<WItemData>();
        QRect rect = option.rect;
        //qDebug() << rect;
        int wx = 5;
        int wy = 5;
        rect.setX(rect.x() + wx);
        rect.setY(rect.y() + wy);
        rect.setWidth(rect.width() - wx * 2);
        rect.setHeight(rect.height() - wy * 2);
        //qDebug() << rect;
        QString text = QString("rowid:%1,col1:%2,col2:%3").arg(d.rowid).arg(d.col1).arg(d.col2);
        painter->setBrush(QColor(0, 0, 0));
        painter->drawRoundedRect(rect, 5, 5);
        painter->setPen(QColor(255, 255, 255));
        painter->drawText(rect, text, QTextOption(Qt::AlignCenter));
    }
}
cpp 复制代码
#pragma once

#include <QAbstractListModel>
#include <QMetaType>


typedef struct {
	int rowid;
	int col1;
	int col2;
} WItemData;

Q_DECLARE_METATYPE(WItemData)

class ListModel  : public QAbstractListModel
{
	Q_OBJECT

public:
	ListModel(QObject *parent = nullptr);
	~ListModel();

	//当子类化QAbstractListModel时,必须提供rowCount()和data()函数的实现
	virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
	virtual int	rowCount(const QModelIndex& parent = QModelIndex()) const;

private:
	QList<WItemData> m_List;
};
cpp 复制代码
#include "ListModel.h"

ListModel::ListModel(QObject *parent)
	: QAbstractListModel(parent)
{
	for (int i = 0; i < 100000; i++)
	{
		WItemData data;
		data.rowid = i;
		data.col1 = i;
		data.col2 = i;
		m_List << data;
	}
}

ListModel::~ListModel()
{}

QVariant ListModel::data(const QModelIndex& index, int role /*= Qt::DisplayRole*/) const
{
	if (!index.isValid())
	{
		return QVariant();
	}

	if (Qt::DisplayRole == role)
	{
		WItemData data(m_List.at(index.row()));
		QVariant variant;
		variant.setValue<WItemData>(data);
		return variant;
	}

	return QVariant();
}

int ListModel::rowCount(const QModelIndex& parent /*= QModelIndex()*/) const
{
	return m_List.size();
}
cpp 复制代码
    ListModel* listModel = new ListModel;
    listView = new QListView;
    listView->setModel(listModel);
    WItemDelegate1* wItemDelegate = new WItemDelegate1(listView);
    listView->setItemDelegate(wItemDelegate);
    listView->show();
相关推荐
互联网中的一颗神经元10 小时前
小白python入门 - 39. 采集流水线小项目
开发语言·python
Wang's Blog10 小时前
Go-Zero 项目开发22:用户群聊功能的实现与完善
开发语言·golang
a11177611 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
Wang's Blog12 小时前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
龚建波13 小时前
《QDebug 2026年6月》
qt
吃好睡好便好15 小时前
MATLAB中图像的读取、写入和显示
开发语言·图像处理·学习·计算机视觉·matlab
yaoxin52112315 小时前
476. Java 反射 - 调用方法
java·开发语言
△曉風殘月〆15 小时前
如何在Linux中安装Qt开发环境
linux·运维·qt
猫头虎16 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
bksczm17 小时前
Linux之日志和线程池、内存池
java·开发语言