Qt之拖拽

void ConfigWidget::mousePressEvent(QMouseEvent *event)
{
        QByteArray itemData;
			QDataStream dataStream(&itemData, QIODevice::WriteOnly);
			dataStream << m_pixmap << QPoint(217, 102) << m_pixName << m_url << m_Uuid << m_action;

			QMimeData *mimeData = new QMimeData;
			mimeData->setData(DragWidget::puzzleMimeType(), itemData);

			QDrag *drag = new QDrag(this);
			drag->setMimeData(mimeData);
			int iW1 = m_pixmap.width();
			int iG1 = m_pixmap.height();
			QPixmap pixmap = m_pixmap.scaled(m_positionW - 55, m_positionH - 40);
			int iW = pixmap.width();
			int iG = pixmap.height();
			drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));
			//m_HotsPos = QPoint(pixmap.width() / 2, pixmap.height() / 2) - m_pTile->pos();
			drag->setPixmap(pixmap);

			if (!(drag->exec(Qt::MoveAction) == Qt::MoveAction)) {

				m_pTile->show();
				QApplication::processEvents();

			}
}

void ConfigWidget::dropEvent(QDropEvent *event)
{
	clock_t startALL, finish;
	double totaltimeALL;
	startALL = clock();
	if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
	{
		QByteArray pieceData = event->mimeData()->data(DragWidget::puzzleMimeType());
		QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
		QPoint point = event->pos();
		//QRect square = targetSquare(event->pos());
		QPixmap pixmap;
		QPoint location;
		QString pieName;
		QString strImageUrl;
		QString uid;
		QString netModel;
		QString action;
		dataStream >> pixmap >> location >> pieName >> strImageUrl >> uid >> netModel >> action;
		if (pieName == QString::fromLocal8Bit("场景"))

    ......
    ......
}

void ConfigWidget::dragMoveEvent(QDragMoveEvent *event)
{
	//QRect updateRect = highlightedRect.united(targetSquare(event->pos()));

	if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
	{
		QByteArray pieceData = event->mimeData()->data(DragWidget::puzzleMimeType());
		QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
		QPoint point = event->pos();
		//QRect square = targetSquare(event->pos());
		QPixmap pixmap;
		QPoint location;
		QString pieName;
		QString strImageUrl;
		QString uid;
		QString netModel;
		dataStream >> pixmap >> location >> pieName >> strImageUrl >> uid >> netModel;
		if (pieName == QString::fromLocal8Bit("场景"))
		{
			event->accept();

			highlightedRect = QRect();
			update();
		}
		else if (pieName == QString::fromLocal8Bit("选项卡"))
		{
			event->accept();

			highlightedRect = QRect();
			update();
		}
		//功能
		else
		{
			if (event->source() == this)
			{
				if (m_strLayout == QString::fromLocal8Bit("自动布局"))
				{
					if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType())
						&& pieceRects.indexOf(targetSquare(event->pos())) == -1) {

						highlightedRect = targetSquare(event->pos());
						event->accept();
					}
					else {
						highlightedRect = QRect();
						event->ignore();
					}
				}
				else
				{
					if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
					{
						event->accept();
					}
					else {
						highlightedRect = QRect();
						event->ignore();
					}
				}
				
			}
			else
			{
				if (m_strLayout == QString::fromLocal8Bit("自动布局"))
				{
					if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
					{

						highlightedRect = targetSquare(event->pos());
						event->setDropAction(Qt::MoveAction);
						event->accept();
					}
					else {
						highlightedRect = QRect();
						event->ignore();
					}
				}
				else
				{
					if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
					{
						event->accept();
					}
					else {
						highlightedRect = QRect();
						event->ignore();
					}
				}
			}

			update();
		}
	}
}

void ConfigWidget::dragEnterEvent(QDragEnterEvent *event)
{

	if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
	{
		event->accept();
	}

	else
		event->ignore();
}

void ConfigWidget::dragLeaveEvent(QDragLeaveEvent *event)
{

}

使用事件过滤器

ui.listWidget->viewport()->installEventFilter(this);
//每一个itemWidget也要installEventFilter(this);



bool DragWidget::eventFilter(QObject *watched, QEvent *event)
{
	if (event->type() == QEvent::MouseButtonPress && watched == ui.listWidget->viewport())
	{
		moussEvent(event);
	}
	else if (event->type() == QEvent::MouseButtonPress && watched != ui.listWidget->viewport())
	{
		QListWidgetItem *item = NULL;
		for (int i = 0; i < ui.listWidget->count(); i++)
		{
			Tile * pTile = static_cast<Tile*>(watched);
			QWidget * pWidget = ui.listWidget->itemWidget(ui.listWidget->item(i));
			Tile * pTileW = static_cast<Tile*>(pWidget);
			if (pTileW == pTile)
			{
				item = ui.listWidget->item(i);
			}
		}
		if (item == NULL)
		{
			return false;
		}
		QByteArray itemData;
		QDataStream dataStream(&itemData, QIODevice::WriteOnly);
		QPixmap pixmap = qvariant_cast<QPixmap>(item->data(Qt::UserRole));
		QPoint location = item->data(Qt::UserRole + 1).toPoint();
		QString strName = item->data(Qt::UserRole + 2).toString();
		QString strImageUrl = item->data(Qt::UserRole + 3).toString();

		dataStream << pixmap << location << strName << strImageUrl;


		m_mimeData = new QMimeData;
		m_mimeData->setData(DragWidget::puzzleMimeType(), itemData);
		m_mimeData->setText(strName);

		m_drag = new QDrag(this);
		m_drag->setMimeData(m_mimeData);
		QPixmap pixmapD = pixmap.scaled(160, 160);
		m_drag->setHotSpot(QPoint(pixmapD.width() / 2, pixmapD.height() / 2));
		m_drag->setPixmap(pixmapD);
		m_drag->setDragCursor(style()->standardPixmap(QStyle::SP_TitleBarMinButton), Qt::LinkAction);
		m_drag->setDragCursor(style()->standardPixmap(QStyle::SP_TitleBarMaxButton), Qt::MoveAction);
		m_drag->exec(Qt::MoveAction);
	}
	return QWidget::eventFilter(watched, event);     //将事件传递给父类

}

void DragWidget::moussEvent(QEvent *event)
{
	QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
	QMenu *menu = new QMenu(this);
	QAction *pAction = new QAction(menu);
	pAction->setText(QString::fromLocal8Bit("设置启动项"));
	menu->addAction(pAction);
	bool bRet = connect(pAction, SIGNAL(triggered()), this, SLOT(slotConfigStart()));
	menu->exec(mEvent->globalPos());
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值