QDrag Class
QDrag 类支持基于 MIME 的拖放数据传输。更多内容...
| 头文件: | #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 能在拖放操作完成后进行资源清理。
在拖动过程中,可以使用位图来表示数据,该位图将随光标一起移动到释放目标处。该位图通常显示一个图标,代表正在传输数据的 MIME 类型,但可以通过setPixmap() 设置任何位图。 可以通过setHotSpot() 函数,将光标的热区位置设置为相对于像素图左上角的相对位置。以下代码将像素图定位,使光标的热区指向其底部边缘的中心:
drag->setHotSpot(QPoint(drag->pixmap().width()/2,
drag->pixmap().height()));注意:在 X11环境下 ,如果热区导致位图直接显示在光标正下方,则位图可能无法跟上鼠标的移动。
源控件和目标控件可通过 `source()` 和 `target()` 获取。这些函数常用于判断拖放操作是否始于并终于同一个控件,以便实现特殊行为。
QDrag 仅处理拖放操作本身。何时开始拖动操作,以及如何构建和使用 QDrag 对象,均由开发者自行决定。 对于给定的控件,通常需要重写mousePressEvent() 来判断用户是否按下了鼠标按钮,并重写mouseMoveEvent() 来检查是否需要 QDrag 对象。
另请参阅 “拖放”、“QClipboard ”、“QMimeData ”、“可拖动图标示例”、“可拖动文本示例”和“放置点示例”。
成员函数文档
[explicit] QDrag::QDrag(QObject *dragSource)
为由 `dragSource` 指定的控件创建一个新的拖拽对象。
[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(),以保持 GUI 的响应性。如果在拖拽操作进行期间调用了任何循环或操作,将会阻塞该拖拽操作。
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()。
© 2026 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.