解决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是否想要使用。