继承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();
相关推荐
hummhumm12 分钟前
Oracle 第29章:Oracle数据库未来展望
java·开发语言·数据库·python·sql·oracle·database
wainyz21 分钟前
Java NIO操作
java·开发语言·nio
喵叔哟29 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk35 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME35 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
起名字真南1 小时前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
tyler_download1 小时前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~1 小时前
qt5将程序打包并使用
开发语言·qt
hlsd#1 小时前
go mod 依赖管理
开发语言·后端·golang
小春学渗透1 小时前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc