Qt使用鼠标选中拖动实现数据的迁移

QT本是就支持鼠标左键选中拖动的功能,Drag和Drop。查看以下示例:
在这里插入图片描述
拖动功能包含两个窗口:一个是源窗口,一个是目标窗口。
在源窗口需要实现:

	void mousePressEvent(QMouseEvent *event) override;
	void mouseReleaseEvent(QMouseEvent *event) override;
	void mouseMoveEvent(QMouseEvent *event) override;

在目标窗口需要实现:

	//窗口进入拖动
	void dragEnterEvent(QDragEnterEvent *event) override;
	//拖动离开
	void dragLeaveEvent(QDragLeaveEvent *event) override;
	//拖动移动
	void dragMoveEvent(QDragMoveEvent *event) override;
	//拖动松开鼠标
	void dropEvent(QDropEvent *event) override;

具体实现过程:

//记录拖拽初始位置
void DragListView::mousePressEvent(QMouseEvent *event) {
	if (event->buttons() & Qt::LeftButton) {
		startPos = event->pos();
		_modelIndex = indexAt(event->pos());
	}
}

void DragListView::mouseReleaseEvent(QMouseEvent *event) {
	if ((event->pos() - startPos).manhattanLength() > 5) {
		return;
	}
	QModelIndex index = indexAt(event->pos());
	setCurrentIndex(index);  //鼠标relesse时才选中
}

void DragListView::mouseMoveEvent(QMouseEvent *event) {
	if (event->buttons() & Qt::LeftButton) {
		if ((event->pos() - startPos).manhattanLength() < QApplication::startDragDistance()) {
			return;
		}
		QModelIndex theDragIndex = indexAt(startPos);
		theDragRow = theDragIndex.row();

		setCurrentIndex(theDragIndex);  //拖拽即选中

		QStandardItemModel* slm = dynamic_cast<QStandardItemModel*>(model());
		QStandardItem *curItem = slm->itemFromIndex(_modelIndex);
		if (curItem == nullptr) {
			return;
		}
		_selectJBCode = curItem->data().toInt();
		//调用接口选中Item
		_iDragItemJB->dragItem(_modelIndex);

		//[1]把拖拽数据放在QMimeData容器中
		QString text = curItem->text();
		QIcon icon = curItem->icon();
		QIcon icon_hover = curItem->icon();
		QByteArray itemData;
		QDataStream dataStream(&itemData, QIODevice::WriteOnly);

		dataStream << _selectJBCode << text ;

		QMimeData *mimeData = new QMimeData;
		mimeData->setData(myMimeType(), itemData);

		//[2]设置拖拽时的缩略图
		Thumbnail *DragImage = new Thumbnail(this);
		DragImage->setupThumbnail(icon_hover, text);
		//DragImage->setIconSize(18);  //default:20
		QPixmap pixmap = DragImage->grab();

		QDrag *drag = new QDrag(this);
		drag->setMimeData(mimeData);
		drag->setPixmap(pixmap);
		drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));
		
		if (drag->exec(Qt::MoveAction) == Qt::MoveAction) {
			
		}
	}
}

目标窗口实现源码:

void Map2DCanvasEx::dragEnterEvent(QDragEnterEvent* event) {
	if (event->mimeData()->hasFormat("DragListView/code-text")) {
		if (event->source() == this) {
			event->setDropAction(Qt::MoveAction);
			event->accept();
		} else {
			event->acceptProposedAction();
		}
	} else {
		event->ignore();
	}

}

void Map2DCanvasEx::dropEvent(QDropEvent *event) {
	//判断接收的是否是指定的对象
	if (event->mimeData()->hasFormat("DragListView/code-text")) {
		//获取拖拽时设置的数据
		QByteArray itemData = event->mimeData()->data("DragListView/code-text");
		QDataStream dataStream(&itemData, QIODevice::ReadOnly);

		QString text;
		int selectJBCode = -1;
		dataStream >> selectJBCode >> text;

		JBPlotManagerInst()->addJB(event->pos());

		if (event->source() == this) {
			event->setDropAction(Qt::MoveAction);
			event->accept();
		} else {
			event->acceptProposedAction();
		}
	} else {
		event->ignore();
	}

}

aaa

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenGL和Qt实现鼠标选中模型的过程如下: 1. 在Qt窗口中,设置一个OpenGL的渲染窗口。 2. 使用OpenGL绘制模型并将其显示在渲染窗口中。 3. 监听鼠标事件,当鼠标点击窗口时,获取鼠标点击的位置。 4. 将鼠标点击的位置转换为OpenGL的坐标系。 5. 使用OpenGL的拾取模式,将鼠标点击位置与模型进行碰撞检测。 6. 如果鼠标点击位置与模型相交,则选中该模型。 7. 在渲染器中绘制选中模型的高亮效果。 8. 重新绘制窗口,将选中模型的高亮效果显示在窗口中。 实现鼠标选中模型的关键是在OpenGL中进行碰撞检测。可以使用射线与模型的相交算法来实现碰撞检测。具体的算法可以是Ray-Casting或Ray-Tracing。 Ray-Casting算法利用鼠标点击位置构建一条射线,然后检查该射线与模型中的三角形是否相交。如果射线与三角形相交,则认为鼠标点击位置与模型相交,并选中该模型。 Ray-Tracing算法更加精确,它会追踪射线直到与模型相交的最近点,找到最近点后则认为鼠标点击位置与模型相交,并选中该模型。 无论选择哪种算法,都需要在程序中进行相应的实现和数学计算。在检测到与模型相交后,可以对选中的模型进行某种视觉效果的处理,例如渲染器中修改模型的颜色或添加高亮效果。 以上是使用OpenGL和Qt实现鼠标选中模型的基本步骤和关键技术。根据具体情况和需求,可以对这个流程进行进一步的优化和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wb175208

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

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

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

打赏作者

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

抵扣说明:

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

余额充值