Qt实现类似Designer中的拖拽效果:从左侧树控件中拖动图标到右侧布局窗口

大家在Qt开发中都用过这样的拖动操作,从左边拖动一个控件到右侧的窗口。或是在其它很多软件使用中,都有把图标通过拖动布置到主画面的操作。在这里插入图片描述
如何实现呢?
先看看Qt帮助中的一个实例:
在这里插入图片描述
这个例子自定义了一个从QFrame继承的类DragWidget,然后实现了四个事件。
运行时,可以从一个widget中拖动图标的位置,也可以把图标拖动到另一个widget中。
其实,还可以在应用程序之间拖动。如下图:
在这里插入图片描述
可以把车子图标拖动到另一个应用程序中。
这是我自己测试的一个程序,要把图标放置到tablewidget中,而且图标位置要居中显示在落点位置最近的单元格中。
分析Qt实例代码:
再写一个DargWidget2,和DragWidget只是名字不一样,这样可以方便跟踪调试。
在这里插入图片描述
在主界面中,添加这两种控件。当在一个控件内部拖动图标时,调用的是它的drop函数。当拖动到另一个控件内时,调用的是另一个控件类的drop函数。
所以在wigdet2的drop函数中,对位置进行一下修正,就实现了目的。

void DragWidget5::dropEvent(QDropEvent *event)
{
	if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
		QByteArray itemData = event->mimeData()->data("application/x-dnditemdata");
		QDataStream dataStream(&itemData, QIODevice::ReadOnly)

		QPixmap pixmap;
		QPoint offset;
		dataStream >> pixmap >> offset;

		QLabel *newIcon = new QLabel(this);
		newIcon->setPixmap(pixmap);

		//计算位置
		QTableWidgetItem * item = m_table->itemAt(event->pos());
		if (item == NULL)
			return;

		int nRow = item->row();
		int nColumn = item->column();
		int x = nColumn * 80 + 40;
		int y = -1;
		if (nRow % 2 == 0)
		{
			y = (nRow + 1) * 50;
		}
		else
			y = (nRow)* 50;

		newIcon->move(QPoint(x,y));
		newIcon->show();
		newIcon->setAttribute(Qt::WA_DeleteOnClose);

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

回到题目中的问题,如果要拖动树控件内容到主窗口的话,可以读取树控件节点的名字,然后找到对应的本地图标,拖放到右侧的时候,在drop函数中再加载图标即可。

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码猿杂谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值