代码逻辑:
1、 利用方法setViewMode(QListView::IconMode)来完成QListWidget的显示模式设置,即只显示图标模式。
2、 利用方法void addTypeAndItems(const QString& strRootPaht, const QString&strType)完成对给定文件中特定模型的读取工作(实现见附录)。
3、 利用方法void slotCurrentIndexChanged(int index)完成对不同的类别切换不同模型列表的功能(实现见附录)。
最终实现效果如下图所示:
拖放时的效果:
方法1:
voidCDockWidget::addTypeAndItems(const QString& strRootPaht, const QString&strType)
{
// 判断给定的路径是否存在,不存在则直接返回
QDir dir(strRootPaht + strType);
if (!dir.exists())
{
return;
}
// 查找目录下制定的模型文件fbx和osg
QFileInfoList fileList =dir.entryInfoList(QStringList() << "*.fbx" <<"*.FBX"<<"*.osg");
QListWidgetItem* pItem;
QList<ST_ItemData*> listItems;
ST_ItemData* itemData = new ST_ItemData;
itemData->pNode = NULL;
listItems.clear();
for (int i = 0; i < fileList.size();++i)
{
QFileInfo info = fileList.at(i);
itemData->id = i;
itemData->strIconPath =info.absolutePath() + QDir::separator() + info.baseName() + ".png";
itemData->pNode =osgDB::readNodeFile(info.absolutePath().toStdString());
itemData->strModelPaht =info.absoluteFilePath();
listItems.append(itemData);
}
// 对查找到的模型信息存储在map中,供之后使用
m_mapListItems[strType] = listItems;
}
方法2:
voidCDockWidget::slotCurrentIndexChanged(int index)
{
QString strType =m_pComboBox->itemData(index, Qt::UserRole).toString();
// 当模型类别发生变化时,先清空列表内容,然后查找相对应的模型添加到列表显示中
m_pListWidget->clear();
QList<ST_ItemData*> listItems =m_mapListItems[strType];
foreach (ST_ItemData* item, listItems)
{
QListWidgetItem* pItem = newQListWidgetItem;
pItem->setIcon(QIcon(item->strIconPath));
pItem->setData(Qt::UserRole,item->id);
m_pListWidget->addItem(pItem);
}
}