首先新建个QListWidget子类:
.h文件内容如下
class ProjectListWidget: public QListWidget
{
Q_OBJECT
public:
ProjectListWidget(QWidget *parent=0);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
private:
void startDrag();
QPoint startPos;
};
cpp内容:
ProjectListWidget::ProjectListWidget(QWidget *parent)
:QListWidget (parent)
{
setAcceptDrops(true);
}
void ProjectListWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button()==Qt::LeftButton)
startPos = event->pos();
// event->ignore();
qDebug() << startPos;
QListWidget::mousePressEvent(event);
}
void ProjectListWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() &Qt::LeftButton){
int distance = (event->pos()-startPos).manhattanLength();
if (distance>=QApplication::startDragDistance())
startDrag();
}
}
void ProjectListWidget::startDrag()
{
QDrag *drag = new QDrag(this);
QListWidgetItem *item =currentItem();
QMimeData *mimeData = new QMimeData;
mimeData->setText(item->text());
drag->setMimeData(mimeData);
if (drag->start(Qt::MoveAction)==Qt::MoveAction)
delete item;
}
void ProjectListWidget::dragEnterEvent(QDragEnterEvent *event)
{
QListWidget *source = qobject_cast < QListWidget* >(event->source());
if (source&&source!=this){
event->setDropAction(Qt::MoveAction);
event->accept();
}
}
void ProjectListWidget::dragMoveEvent(QDragMoveEvent *event)
{
QListWidget *source = qobject_cast < QListWidget* >(event->source());
if (source&&source!=this){
event->setDropAction(Qt::MoveAction);
event->accept();
}
}
void ProjectListWidget::dropEvent(QDropEvent *event)
{
QListWidget *source = qobject_cast < QListWidget* >(event->source());
if (source&&source != this ){
addItem(event->mimeData()->text());
event->setDropAction(Qt::MoveAction);
event->accept();
}
}
main:
QStringList list1, list2;
list1 << "黑猫警长" <<"兔八哥"<<"三毛"<<"舒克"<<"贝塔";
list2 <<"阿童木" <<"皮卡丘" <<"卡卡西" <<"奈落"<<"一休";
QListWidget *listWidget1 = new ProjectListWidget(this);
QListWidget *listWidget2 = new ProjectListWidget(this);
listWidget1->addItems(list1);
listWidget1->setIconSize(QSize(200,200));
listWidget1->setGeometry(100,150,300,200);
listWidget2->addItems(list2);
listWidget2->setGeometry(100,300,300,200);
最后效果