原创:Qt自定义拖放
#pragma once #include <QTableView> #include <QStandardItemModel> #include <QTableWidget> #include <QtGui> #include <QDrag> class DragTabel : public QTableView { public: DragTabel(QWidget *parent = 0); void AddItem(QString aName); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); void performDrag(); private: QStandardItemModel *m_pModel; QPoint startPos; };
#include "DragTabel.h" DragTabel::DragTabel( QWidget *parent /*= 0*/ ): QTableView(parent) { m_pModel = new QStandardItemModel; m_pModel->setHorizontalHeaderItem(0,new QStandardItem(tr("name"))); setModel(m_pModel); setAcceptDrops(true); } void DragTabel::AddItem( QString aName ) { m_pModel->appendRow(new QStandardItem(aName)); } void DragTabel::mousePressEvent( QMouseEvent *event ) { if (event->button() == Qt::LeftButton) startPos = event->pos(); QTableView::mousePressEvent(event); } void DragTabel::mouseMoveEvent( QMouseEvent *event ) { if (event->buttons() & Qt::LeftButton) { int distance = (event->pos() - startPos).manhattanLength(); if (distance >= QApplication::startDragDistance()) performDrag(); } QTableView::mouseMoveEvent(event); } void DragTabel::dragEnterEvent( QDragEnterEvent *event ) { DragTabel *source = (DragTabel *)((void*)(event->source())); if (source && source != this) { event->setDropAction(Qt::MoveAction); event->accept(); } } void DragTabel::dragMoveEvent( QDragMoveEvent *event ) { DragTabel *source = (DragTabel *)((void*)(event->source())); if (source && source != this) { event->setDropAction(Qt::MoveAction); event->accept(); } } void DragTabel::dropEvent( QDropEvent *event ) { DragTabel *source = (DragTabel *)((void*)(event->source())); if (source && source != this) { AddItem(event->mimeData()->text()); event->setDropAction(Qt::MoveAction); event->accept(); } } void DragTabel::performDrag() { if (1) { QMimeData *mimeData = new QMimeData; mimeData->setText(m_pModel->data(currentIndex()).toString()); QDrag* drag = new QDrag(this); drag->setMimeData(mimeData); //drag->setPixmap(QPixmap(":/images/person.png")); if (drag->exec(Qt::MoveAction) == Qt::MoveAction) { } } }
然后就是支持自定义拖拽数据类型!