Qt QListWidget拖拽实现

接着前面的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();
	}
}


效果如图:



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



  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现QListWidget中Item的拖拽,需要进行以下步骤: 1. 启用QListWidget拖拽功能,可以通过在QListWidget对象上调用setDragEnabled(true)实现。 2. 重写QListWidget的dragEnterEvent和dragMoveEvent事件,以便检测拖动操作是否在QListWidget中被接受。您可以通过调用QDragEnterEvent和QDragMoveEvent对象的acceptProposedAction()方法来接受拖动操作并允许其继续。 3. 重写QListWidget的dropEvent事件,以便处理放置操作。在该函数中,您可以通过调用QDropEvent对象的mimeData()方法来检索QListWidget中被拖动的数据。一旦您获取了数据,就可以将其插入到QListWidget中,然后调用QDropEvent对象的accept()方法来接受放置操作。 下面是一个简单的示例代码: ``` void MyListWidget::startDrag(Qt::DropActions supportedActions) { QListWidgetItem *item = currentItem(); QMimeData *mimeData = new QMimeData; mimeData->setData("text/plain", item->text().toUtf8()); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(QPixmap(":/images/drag.png")); drag->setHotSpot(QPoint(drag->pixmap().width()/2, drag->pixmap().height()/2)); if (drag->exec(Qt::MoveAction) == Qt::MoveAction) { delete item; } } void MyListWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("text/plain")) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } void MyListWidget::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("text/plain")) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } void MyListWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("text/plain")) { QByteArray data = event->mimeData()->data("text/plain"); QString text = QString::fromUtf8(data); QListWidgetItem *newItem = new QListWidgetItem(text, this); newItem->setFlags(newItem->flags() | Qt::ItemIsEditable); event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } ``` 希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值