由于新项目需要,要设计类似windows下的文件拖放到文件夹的视觉效果,废话少说上代码!
.h
<span style="font-size:18px;">#ifndef DRAGLISTWIDGET_H
#define DRAGLISTWIDGET_H
#include <QDrag>
#include <QEvent>
#include <QMouseEvent>
#include <QListWidget>
#include <QListWidgetItem>
class DragListWidget : public QListWidget
{
Q_OBJECT
public:
DragListWidget(QWidget *parent = 0);
protected:
void dropEvent(QDropEvent *event);
public:
QPoint endPos;
};
#endif // DRAGLISTWIDGET_H</span>
.cpp
<span style="font-size:18px;">#include "draglistwidget.h"
#include <QDebug>
DragListWidget::DragListWidget(QWidget *parent):QListWidget(parent)
{
setCurrentRow(10);
setDragEnabled(true);
setViewMode(QListView::IconMode);
setResizeMode(QListView::Adjust);
setDragDropMode(QAbstractItemView::DragDrop);
setAcceptDrops(true);//设置QListWidget的Item项可以被拖拽
setSelectionMode(QAbstractItemView::ContiguousSelection );
QListWidgetItem * listItem;
QString NoStr;
for(int i = 0;i<10;i++)
{
NoStr = QString::number(i+1);
listItem = new QListWidgetItem(NoStr,this);
listItem->setSizeHint(QSize(50,50));
listItem->setIcon(QIcon(":/Zip"));
addItem(listItem);
}
}
void DragListWidget::dropEvent( QDropEvent *event )
{
DragListWidget *source = qobject_cast<DragListWidget *>(event->source());
if (source && source == this)
{
//得到鼠标移动到的坐标
endPos = event->pos();
//通过endPos获取鼠标位置所在的行
QListWidgetItem *Enditem = itemAt(endPos);
//判断该位置是否在Item上
int rowCount = row(Enditem);
if(rowCount >= 0)
{
QList<QListWidgetItem*> pListItem;
pListItem = source->selectedItems();
int count = pListItem.count();
if(count)
{
for(int i= 0;i<count;i++)
{
QListWidgetItem *item = pListItem.at(i);
removeItemWidget(item);
delete item;
}
}
}
}
}</span>