一、描述
1、拖放是用户在应用程序中复制或移动数据的一种直观方式,并且在许多桌面环境中用作在应用程序之间复制数据的机制。
2、Qt中的拖放支持以QDrag类为中心,此类处理拖放操作的大多数细节。
3、通过拖放操作要传输的数据包含在QMimeData对象中。 通过setMimeData()指定:
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
drag->setMimeData(mimeData);
4、setMimeData()将QMimeData对象的所有权分配给QDrag对象。必须在具有父QObject的堆上构造QDrag,以确保Qt在完成拖放操作后可以清理。
5、可以使用source()和target()找到源和目标小部件。这些功能通常用于确定拖放操作是否在同一窗口小部件上开始和结束,以便可以实现特殊行为。
二、信号
1、void actionChanged(Qt::DropAction action)
当对象的放下动作被改变时会发出此信号。
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
connect(drag,&QDrag::actionChanged,[this]
{
qDebug()<<"emited QDrag::actionChanged";
});
void Form::dragMoveEvent(QDragMoveEvent *event)
{
if(event->pos().manhattanLength() > 500)
event->setDropAction(Qt::IgnoreAction);
}
拖动距离>500则忽略拖拽动作,效果:
2、void targetChanged(QObject *newTarget)
放下的目标改变时发出此信号。
connect(drag,&QDrag::targetChanged,this,[]
{
qDebug()<<"emitid QDrag::targetChanged";
});
效果:
二、实用成员函数
1、[static] void cancel()
取消拖放操作。
2、Qt::DropAction exec(Qt::DropActions supportedActions = Qt::MoveAction)
开始拖放操作,并在完成时返回指示所请求的放置动作的值。 用户可以从中选择的放置动作在supportedActions中指定。 将按照以下顺序在允许的操作中选择默认的建议操作:移动,复制和链接。
3、Qt::DropAction exec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction)
同上,参数2是默认放下动作。
4、void setPixmap(const QPixmap &pixmap) / QPixmap pixmap()
设置/获取拖动过程中表示数据的图片。
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(QPixmap(":/woodbackground.png"));
5、void setHotSpot(const QPoint &hotspot) / QPoint hotSpot()
设置/获取拖动时pixmap()的图片和鼠标中心的相对位置。
例,设置鼠标居于图片中心点:
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
auto pixmap = QPixmap(":/woodbackground.png");
drag->setPixmap(pixmap);
drag->setHotSpot(QPoint(pixmap.width()/2,pixmap.height()/2));
6、void setDragCursor(const QPixmap &cursor, Qt::DropAction action) / QPixmap dragCursor(Qt::DropAction action)
设置/获取拖放动作的光标。
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
auto pixmap = QPixmap(":/woodbackground.png");
drag->setPixmap(pixmap);
drag->setDragCursor(QPixmap(":/a.png"),Qt::MoveAction);
drag->setHotSpot(QPoint(pixmap.width()/2,pixmap.height()/2));
7、QObject *source() / QObject *target()
拖放的源对象/目标对象,指的是窗口而不是其中的子控件。
8、QMimeData *mimeData() / void setMimeData(QMimeData *data)
设置/获取mime对象,见:QMimeData详解。