Qt QListWidget拖拽实现

来源:互联网 发布:雅思托福的区别知乎 编辑:程序博客网 时间:2024/06/08 15:34

接着前面的QTableWidget继续写吧,原本实现QTableWidget的拖拽,结果还是没弄好,唉……一个字,搓!两个字,很搓!

QTableWidget拖拽没有实现,但是还是有希望的,希望至少还不是在田野上,QListWidget的拖拽实现了,亲们……

直接贴代码吧!

==========================================================================================

下面的实现是在一个控件里面拖拽Item,插入到鼠标释放的位置

#ifndef DRAG_TABLE_H#define DRAG_TABLE_H#include <QTableWidget>#include <QListWidget>#include <QtGui>#include <QDrag>class DragListWidget : public QListWidget{public:DragListWidget(QWidget *parent = 0);protected:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void dragEnterEvent(QDragEnterEvent *event);void dragMoveEvent(QDragMoveEvent *event);void dropEvent(QDropEvent *event);public:QPoint startPos;QPoint endPos;};#endif
DragListWidget.cpp


#include "DragTable.h"DragListWidget::DragListWidget(QWidget *parent):QListWidget(parent){this->setCurrentRow(10);addItem("1");addItem("2");addItem("3");addItem("4");addItem("5");addItem("6");addItem("7");addItem("8");addItem("9");addItem("10");this->setAcceptDrops(true);//设置QListWidget的Item项可以被拖拽}void DragListWidget::mousePressEvent( QMouseEvent *event ){if (event->button() == Qt::LeftButton)startPos = event->pos();QListWidget::mousePressEvent(event);}void DragListWidget::mouseMoveEvent(QMouseEvent *event){QListWidgetItem *item = currentItem();mimeData = new QMimeData;mimeData->setText(item->text());QDrag *drag = new QDrag(this);drag->setMimeData(mimeData);//drag->setPixmap(pixmap);Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);if(dropAction == Qt::MoveAction){delete item;//删除原有的item,在dropEvent(QDropEvent *event)函数中插入item}}void DragListWidget::mouseReleaseEvent(QMouseEvent *event){int distance = (endPos - startPos).manhattanLength();if (distance >= QApplication::startDragDistance()){startDrag();}}void DragListWidget::dragEnterEvent( QDragEnterEvent *event ){DragListWidget *source = (DragListWidget *)((void*)(event->source()));if (source && source == this) {event->setDropAction(Qt::MoveAction);event->accept();}}void DragListWidget::dragMoveEvent( QDragMoveEvent *event ){DragListWidget *source = (DragListWidget *)((void*)(event->source()));if (source && source == this) {event->setDropAction(Qt::MoveAction);event->accept();}}void DragListWidget::dropEvent( QDropEvent *event ){DragListWidget *source = (DragListWidget *)((void*)(event->source()));if (source && source == this) {endPos = event->pos();//得到鼠标移动到的坐标QListWidgetItem *itemRow = itemAt(endPos);.//通过endPos获取鼠标位置所在的行int rowCount = row(itemRow);insertItem(rowCount + 1,mimeData->text());//row+1 为鼠标所指向的行,如果只是向末尾位置插入,把insertItem(rowCount + 1,mimeData->text())改为addItem(mimeData->text())event->setDropAction(Qt::MoveAction);event->accept();}}



效果如图:


===================================================================================

从其他的QListWidget中拖拽到另一个QListWidget

DragListWidget.h


#ifndef DRAG_TABLE_H#define DRAG_TABLE_H#include <QTableWidget>#include <QListWidget>#include <QtGui>#include <QDrag>class DragListWidget: public QListWidget{public:DragListWidget(QWidget *parent = 0);protected:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void dragEnterEvent(QDragEnterEvent *event);void dragMoveEvent(QDragMoveEvent *event);void dropEvent(QDropEvent *event);public:QPoint startPos;QPoint endPos;};#endif

DragListWidget.cpp

#include "DragTable.h"DragListWidget::DragListWidget(QWidget *parent):QListWidget(parent){this->setCurrentRow(10);addItem("1");addItem("2");addItem("3");addItem("4");addItem("5");addItem("6");addItem("7");addItem("8");addItem("9");addItem("10");this->setAcceptDrops(true);//设置QListWidget的Item项可以被拖拽}void DragListWidget::mousePressEvent( QMouseEvent *event ){if (event->button() == Qt::LeftButton)startPos = event->pos();QListWidget::mousePressEvent(event);}void DragListWidget::mouseMoveEvent(QMouseEvent *event){if (event->buttons() & Qt::LeftButton) {        int distance = (event->pos() - startPos).manhattanLength();        if (distance >= QApplication::startDragDistance())            startDrag();    }    QListWidget::mouseMoveEvent(event);}void DragListWidget::dragEnterEvent( QDragEnterEvent *event ){DragListWidget *source = (DragListWidget *)((void*)(event->source()));if (source && source != this) {        event->setDropAction(Qt::MoveAction);        event->accept();    }}void DragListWidget::dragMoveEvent( QDragMoveEvent *event ){DragListWidget *source = (DragListWidget *)((void*)(event->source()));if (source && source != this) {event->setDropAction(Qt::MoveAction);event->accept();}}void DragListWidget::dropEvent( QDropEvent *event ){DragListWidget *source = (DragListWidget *)((void*)(event->source()));if (source && source != this) {endPos = event->pos();QListWidgetItem *itemRow = itemAt(endPos);int rowCount = row(itemRow);insertItem(rowCount + 1,mimeData->text());//addItem(event->mimeData()->text());event->setDropAction(Qt::MoveAction);event->accept();}}


效果如图:



有什么地方不对,还请大牛指点,学习中……