【QT】解决QListview无法调整自定义model中的图片大小问题

解决QListview无法调整自定义model中的图片大小问题

前段时间项目中需要使用QT的MVC来实现一个功能,由于刚刚开始接触QT,在折腾了两天之后写了一个demo,但在实现过程中有一个问题卡了挺久,借着周末有空记录一下。

项目场景:

需求是使用QListView来显示自定义model中的图片资源,要求图片可以以列表形式和图标形式展示,以图标形式展示时有预览效果,以列表形式展示时图标要缩小到列表行大小,本文使用QAbstractTableModel作为自定义ImageModel的基类,并且在ImageModel中重新实现了rowCount,columnCount,data,setData,insertRows等几个基本函数。

问题描述:

实现过程中发现显示的图片只能以大图展示,效果如下图所示:
列表形式
图标形式
其中以列表形式展示的图片大小并没有缩小到列表大小。
data函数的实现如下:

// data函数的重新实现
QVariant ImageModel::data(const QModelIndex & index, int role) const
{
	QPair<QString, QPixmap> da = m_data[index.row()];
	switch (role)
	{
	case Qt::DisplayRole:
		return da.first;
	case Qt::DecorationRole:
		return da.second;
	default:
		break;
	}
	return QVariant();
}

切换按钮的实现如下:

void MyWidget::onSwitchViewBtnClicked()
{
	if (ui.switchViewBtn->isChecked())
	{
		ui.listView->setViewMode(QListView::ListMode);
		ui.listView->setIconSize(m_iconSize); // m_iconSize为保存的图标默认大小
	}
	else
	{
		ui.listView->setViewMode(QListView::IconMode);
		ui.listView->setIconSize(QSize(100,100));
	}

原因分析:

图片大小无法通过QListView的setIconSize()生效,一开始我以为是没有在data()函数中设置model的Qt::SizeHintRole,但经过尝试之后发现行不通,应该是QListView自己控制图标大小,不接受model提供的建议大小,折腾了一段时间未果,在重新查阅QT帮助手册时看到:
在这里插入图片描述
Qt::DecorationRole的描述中有三种选择,分别是QColor、QIcon、QPixmap,而我使用的是QPixmap保存图片,于是尝试将QPixmap转换为QIcon,问题解决!!效果图如下:
在这里插入图片描述
在这里插入图片描述

总结

刚开始接触QT,对其中Model/View的内部原理不太懂,上述问题使用QIcon直接保存图片应该更加方便,不用进行转换,View部分对资源的展示有自己的控制,Model部分只提供不同的Role对应的效果属性,具体的使用需要看View是否想要使用。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值