使用Qt的QListWidget完成拖拽功能

时间:2021-06-19 19:44:10

代码逻辑:

1、         利用方法setViewMode(QListView::IconMode)来完成QListWidget的显示模式设置,即只显示图标模式。

2、         利用方法void addTypeAndItems(const QString& strRootPaht, const QString&strType)完成对给定文件中特定模型的读取工作(实现见附录)。

3、         利用方法void slotCurrentIndexChanged(int index)完成对不同的类别切换不同模型列表的功能(实现见附录)。

 

最终实现效果如下图所示:

使用Qt的QListWidget完成拖拽功能

拖放时的效果:

 使用Qt的QListWidget完成拖拽功能

方法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);

       }

}