原创: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)
		{

		}
	}
}

  然后就是支持自定义拖拽数据类型!

 

posted @ 2013-06-05 10:34  hailong  阅读(4083)  评论(0编辑  收藏  举报