QDrag Class
QDrag 类支持基于 MIME 的拖放数据传输。更多
Header: | #include <QDrag> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
继承: | QObject |
公共函数
QDrag(QObject *dragSource) | |
virtual | ~QDrag() |
Qt::DropAction | defaultAction() const |
QPixmap | dragCursor(Qt::DropAction action) const |
Qt::DropAction | exec(Qt::DropActions supportedActions = Qt::MoveAction) |
Qt::DropAction | exec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction) |
QPoint | hotSpot() const |
QMimeData * | mimeData() const |
QPixmap | pixmap() const |
void | setDragCursor(const QPixmap &cursor, Qt::DropAction action) |
void | setHotSpot(const QPoint &hotspot) |
void | setMimeData(QMimeData *data) |
void | setPixmap(const QPixmap &pixmap) |
QObject * | source() const |
Qt::DropActions | supportedActions() const |
QObject * | target() const |
信号
void | actionChanged(Qt::DropAction action) |
void | targetChanged(QObject *newTarget) |
静态公共成员
void | cancel() |
详细说明
拖放是用户在应用程序中复制或移动数据的一种直观方式,在许多桌面环境中被用作在应用程序之间复制数据的机制。Qt 中的拖放支持以 QDrag 类为中心,该类处理拖放操作的大部分细节。
通过拖放操作传输的数据包含在QMimeData 对象中。该对象通过setMimeData() 函数以如下方式指定:
QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(commentEdit->toPlainText()); drag->setMimeData(mimeData);
请注意,setMimeData() 会将QMimeData 对象的所有权分配给 QDrag 对象。QDrag 必须在堆上构建一个父QObject ,以确保 Qt XML 可以在拖放操作完成后进行清理。
在拖放过程中,可以使用像素图来表示数据,像素图将随光标移动到拖放目标。该像素图通常显示一个代表所传输数据 MIME 类型的图标,但也可以使用setPixmap() 设置任何像素图。光标的热点可以通过setHotSpot() 函数给定一个相对于像素图左上角的位置。下面的代码定位了像素图,使光标的热点指向像素图底边的中心:
drag->setHotSpot(QPoint(drag->pixmap().width()/2, drag->pixmap().height()));
注意: 在 X11 上,如果热点导致像素图显示在光标的正下方,那么像素图可能无法跟上鼠标的移动。
通过source() 和target() 可以找到源部件和目标部件。这些函数通常用于确定拖放操作是否在同一部件上开始和结束,以便实现特殊行为。
QDrag 只处理拖放操作本身。至于拖放操作何时开始,以及如何构造和使用 QDrag 对象,则由开发人员决定。对于给定的 widget,通常需要重新实现mousePressEvent() 以确定用户是否按下了鼠标按钮,并重新实现mouseMoveEvent() 以检查是否需要 QDrag。
另请参阅 拖放、QClipboard 、QMimeData 、可拖放图标示例、可拖放文本示例和拖放网站示例。
成员函数文档
[explicit]
QDrag::QDrag(QObject *dragSource)
为dragSource 指定的 widget 构建一个新的拖动对象。
[virtual noexcept]
QDrag::~QDrag()
销毁拖动对象。
[signal]
void QDrag::actionChanged(Qt::DropAction action)
当与拖动相关的action 发生变化时会发出该信号。
另请参阅 targetChanged().
[static]
void QDrag::cancel()
取消 Qt 启动的拖动操作。
注: 目前在 Windows 和 X11 上实现。
另请参阅 exec()。
Qt::DropAction QDrag::defaultAction() const
返回此拖动操作的默认拖放操作。
另请参阅 exec() 和supportedActions()。
QPixmap QDrag::dragCursor(Qt::DropAction action) const
返回action 的拖动光标。
另请参阅 setDragCursor() 。
Qt::DropAction QDrag::exec(Qt::DropActions supportedActions = Qt::MoveAction)
开始拖放操作,并在操作完成后返回一个表示所请求的拖放操作的值。用户可选择的拖放操作在supportedActions 中指定。默认建议的操作将按以下顺序从允许的操作中选择:移动、复制和链接。
注意:在 Linux 和 macOS 上,拖放操作可能需要一些时间,但该功能不会阻塞事件循环。在执行操作时,其他事件仍会传递给应用程序。在 Windows 上,Qt 事件循环会在操作过程中被阻塞。
另请参阅 cancel()。
Qt::DropAction QDrag::exec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction)
开始拖放操作,并在操作完成后返回一个表示所请求的拖放操作的值。用户可选择的拖放操作在supportedActions 中指定。
defaultDropAction 决定了用户在不使用修改键的情况下执行拖放操作时将建议执行的操作。
注意:在 Linux 和 macOS 上,拖放操作可能需要一些时间,但该功能不会阻塞事件循环。在执行操作时,其他事件仍会传递给应用程序。在 Windows 上,Qt 事件循环会在操作过程中被阻塞。不过,Windows 上的QDrag::exec() 会导致 processEvents() 被频繁调用,以保持图形用户界面的响应速度。如果在拖动操作激活时调用任何循环或操作,都将阻止拖动操作。
QPoint QDrag::hotSpot() const
返回热点相对于光标左上角的位置。
另请参阅 setHotSpot()。
QMimeData *QDrag::mimeData() const
返回拖动对象封装的 MIME 数据。
另请参阅 setMimeData()。
QPixmap QDrag::pixmap() const
返回拖放操作中用于表示数据的像素图。
另请参阅 setPixmap()。
void QDrag::setDragCursor(const QPixmap &cursor, Qt::DropAction action)
为action 设置拖动cursor 。这样就可以覆盖默认的本地游标。要恢复使用action 的本地游标,请输入空值QPixmap 作为cursor 。
注意:将拖动光标设置为 IgnoreAction 可能无法在所有平台上运行。经测试,X11 和 macOS 可以正常工作。Windows 不支持。
另请参阅 dragCursor() 。
void QDrag::setHotSpot(const QPoint &hotspot)
将热点相对于像素图左上角的位置设置为hotspot 指定的点。
注意:在 X11 上,如果热点导致像素图显示在光标的正下方,则像素图可能无法跟上鼠标的移动。
另请参阅 hotSpot().
void QDrag::setMimeData(QMimeData *data)
设置要发送到给定 MIMEdata 的数据。数据的所有权将转移到QDrag 对象。
另请参阅 mimeData() 。
void QDrag::setPixmap(const QPixmap &pixmap)
将pixmap 设置为用于在拖放操作中表示数据的像素图。只能在拖动开始前设置像素图。
另请参阅 pixmap()。
QObject *QDrag::source() const
返回拖放对象的来源。这是拖放操作的源部件。
Qt::DropActions QDrag::supportedActions() const
返回此拖动操作可能的下拉操作集。
另请参阅 exec() 和defaultAction()。
QObject *QDrag::target() const
返回拖放操作的目标。这是拖放对象所在的部件。
[signal]
void QDrag::targetChanged(QObject *newTarget)
当拖放操作的目标发生变化时会发出该信号,newTarget 为新目标。
另请参阅 target() 和actionChanged()。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.