当前位置:   article > 正文

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

qlistview图片

解决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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

切换按钮的实现如下:

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));
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

原因分析:

图片大小无法通过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是否想要使用。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号