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

		}
	}
}

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM