QT 拖放QListWidget内的Item(效果类似剪切)

时间:2021-01-16 19:33:55

由于新项目需要,要设计类似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>