void CBasePictureComboBox::addItem(QImage img,QString name)
{
QMutexLocker locker(&m_mutex);
QList<QStandardItem*> items = m_pModel->findItems(name);
if (items.isEmpty())
{
QStandardItem *item = new QStandardItem();
// 添加图片和文字到项中
qreal aspectRatio = qreal(img.width()) / qreal(img.height());
img = img.scaledToHeight(ITEM_HEIGHT); //img的高度决定paintEvent中option的高度
item->setData(img, Qt::UserRole); // 将图片数据存储在UserRole中
item->setData(aspectRatio, Qt::UserRole+1); //存储图片原始宽高比
item->setData(name, Qt::DisplayRole); // 设置显示的文字数据
m_pModel->appendRow(item);
}
else
{
foreach (QStandardItem *item, items)
{
QModelIndex index = m_pModel->indexFromItem(item);
qreal aspectRatio = qreal(img.width()) / qreal(img.height());
img = img.scaledToHeight(ITEM_HEIGHT); //img的高度决定paintEvent中option的高度
// item->setData(img, Qt::UserRole); // 将图片数据存储在UserRole中
// item->setData(aspectRatio, Qt::UserRole+1); //存储图片原始宽高比
QMap<int,QVariant> roles;
roles.insert(Qt::UserRole,img);
roles.insert(Qt::UserRole+1,aspectRatio);
m_pModel->setItemData(index,roles);
}
}
}
直接用setData发现程序退出时会崩溃,可能是因为指针已经被释放掉了。根据item获取对应的索引,通过索引设置data,程序能正常退出。