QT事件Trick
拖动
void DWidget::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){QListWidgetItem *selItem = currentItem();if(selItem!= nullptr){m_startPos=event->pos(); //记录鼠标按下时的起始位置}}QListWidget::mousePressEvent(event);
}void DWidget::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons()&Qt::LeftButton){int instance=(event->pos()-m_startPos).manhattanLength(); //计算拖动位置与起始位置的距离if(instance>=QApplication::startDragDistance()) //防止手抖,必须超过一定距离。QApplication::startDragDistance()默认为4。{perfomDrag();}}
}
void DWidget::perfomDrag()
{QListWidgetItem *pItem = currentItem(); //当前拖动项if(pItem!= nullptr&&!pItem->text().contains(tr("参数"))){QDrag *drag = new QDrag(this); //拖动类QMimeData *pMimedata = new QMimeData;DragParameters param=pItem->data(Qt::UserRole).value<DragParameters>();//传递数据QByteArray outBa;outBa.resize(sizeof(param));QBuffer buffer(&outBa);buffer.open(QIODevice::WriteOnly);QDataStream out(&buffer);out << param;buffer.close();pMimedata->setData("application/DragParameters",outBa);//拖动图片显示,显示参数名QString text=pItem->text();QPainter painter(&pix);painter.drawText(rect, text);drag->setPixmap(pix);drag->setMimeData(pMimedata);Qt::DropAction action = drag->exec(Qt::MoveAction);if(action==Qt::MoveAction) //移动{}else if(action==Qt::IgnoreAction) //拖动被拒、无接收{}}
}
QMimeData
Qt中封装MIME类型数据的容器,允许应用程序传输文本、图像、颜色、自定义二进制数据等。
application/DragParameters
:自定义MIME类型,明确标识拖拽操作中传递的数据类型,确保发送方和接收方使用同一标识解析数据。
数据内容 (outBa
):类型为 QByteArray 的字节数组,包含实际传输的二进制数据。