Qt的拖放功能

对于源控件,需要重写鼠标按下事件和鼠标移动事件

class TweenMouldListWidget : public QListWidget
{
	Q_OBJECT

public:
	TweenMouldListWidget(QWidget *parent = Q_NULLPTR);
	~TweenMouldListWidget();

protected:
	virtual void mousePressEvent(QMouseEvent *event) override;
	virtual void mouseMoveEvent(QMouseEvent *event) override;

private:
	QPoint m_startPos;
};

void TweenMouldListWidget::mousePressEvent(QMouseEvent *event)
{
	// 左键按下,记录一个按下的位置
	if (event->button() == Qt::LeftButton)
		m_startPos = event->pos();

	QListWidget::mousePressEvent(event);
}

void TweenMouldListWidget::mouseMoveEvent(QMouseEvent *event)
{
	if (event->buttons() & Qt::LeftButton)
	{
		// 计算一个移动距离,防止鼠标抖动
		int distance = (event->pos() - m_startPos).manhattanLength();
		if (distance >= QApplication::startDragDistance())
		{
			// 封装传递数据
			QListWidgetItem *item = currentItem();
			QVariant var = item->data(Qt::UserRole);
		
			QMimeData *mimeData = new QMimeData;
			mimeData->setText(item->text());
			mimeData->setImageData(var);
		
			QDrag *drag = new QDrag(this);
			drag->setMimeData(mimeData);
			drag->exec(Qt::MoveAction);
		}
	}
	QListWidget::mouseMoveEvent(event);
}

对于目的控件,首先需要设置启用拖放属性,一般在构造函数中添加下面这一句

setAcceptDrops(true);

然后重写dragEnterEvent和dropEvent

void TimeLine::dragEnterEvent(QDragEnterEvent *event)
{
	// 这个方法必须重写且必须调用下面这一句,否则控件不接收拖放
	event->acceptProposedAction();
}

void TimeLine::dropEvent(QDropEvent *event)
{
	// 取出传递的数据,然后做其他事情
	const QMimeData* pData = event->mimeData();
	QVariant var = pData->imageData();
	TweenMould tween = var.value<TweenMould>();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木千

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值