QDrag 类

QDrag 类提供基于 MIME 的拖放数据传输支持。 更多...

头文件 #include <QDrag>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
继承 QObject

公共函数

QDrag(QObject *dragSource)
虚拟~QDrag()
Qt::DropActiondefaultAction() const
QPixmapdragCursor(Qt::DropAction action) const
Qt::DropActionexec(Qt::DropActions supportedActions = Qt::MoveAction)
Qt::DropActionexec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction)
QPointhotSpot() const
QMimeData *mimeData() const
QPixmappixmap() const
voidsetDragCursor(const QPixmap &cursor, Qt::DropAction action)
voidsetHotSpot(const QPoint &hotspot)
voidsetMimeData(QMimeData *data)
voidsetPixmap(const QPixmap &pixmap)
QObject *source() const
Qt::DropActionssupportedActions() const
QObject *target() const

信号

voidactionChanged(Qt::DropAction action)
voidtargetChanged(QObject *newTarget)

静态公共成员

voidcancel()

详细描述

拖放是用户在应用程序中复制或移动数据的一种直观方式,它在许多桌面环境中作为在应用程序之间复制数据的一种机制。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。

另请参阅:拖放操作QClipboardQMimeData可拖拽图标示例可拖拽文本示例放置点示例

成员函数文档

[显式构造] QDrag::QDrag(QObject *dragSource)

使用dragSource指定的控件构造一个新拖动对象。

[虚拟 noexcept] QDrag::~QDrag()

销毁拖动对象。

[信号] void QDrag::actionChanged(Qt::DropAction action)

当与拖动关联的action更改时,将发出此信号。

另请参阅:targetChanged

[静态] void QDrag::cancel()

取消Qt启动的拖放操作。

注意:目前此操作在Windows和X11上实现。

另请参阅:exec

Qt::DropAction QDrag::defaultAction() const

返回此拖动操作默认建议的放置操作。

另请参阅:execsupportedActions

QPixmap QDrag::dragCursor(Qt::DropAction action) const

返回action对应的拖动光标。

另请参阅:setDragCursor

Qt::DropAction QDrag::exec(Qt::DropActions supportedActions = Qt::MoveAction)

开始拖放操作,并在完成后返回一个表示请求的放下动作的值。用户可以选择的放下动作在 supportedActions 中指定。默认建议的操作将在以下顺序中选中允许的操作之一:移动、复制和链接。

注意:在 Linux 和 macOS 上,拖放操作可能需要一些时间,但此函数不会阻塞事件循环。在操作执行期间,其他事件仍然发送到应用程序。在 Windows 上,Qt 事件循环在操作期间被阻塞。

参阅取消

Qt::DropAction QDrag::exec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction)

开始拖放操作,并在完成后返回一个表示请求的放下动作的值。用户可以选择的放下动作在 supportedActions 中指定。

defaultDropAction 确定了在没有使用修改键的情况下,用户在执行拖动时将被建议的操作。

注意:在 Linux 和 macOS 上,拖放操作可能需要一些时间,但此函数不会阻塞事件循环。在操作执行期间,其他事件仍然发送到应用程序。在 Windows 上,Qt 事件循环在操作期间被阻塞。然而,QDrag::exec() 在 Windows 上会导致 processEvents() 频繁调用,以保持 GUI 的响应性。如果在一个拖动操作活动期间调用任何循环或操作,它将会阻塞拖动操作。

QPoint QDrag::hotSpot() const

返回热点的相对位置,它与光标左上角的位置有关。

参阅设置热点

QMimeData *QDrag::mimeData() const

返回封装在拖动对象中的 MIME 数据。

参阅设置 MIME 数据

QPixmap QDrag::pixmap() const

返回用于在拖放操作中表示数据的位图。

参阅设置位图

void QDrag::setDragCursor(const QPixmap &cursor, Qt::DropAction action)

设置 action 的拖动 cursor。这允许你覆盖默认的本地光标。要恢复使用 action 的本地光标,请将 cursor 作为一个值为 null 的 QPixmap 传递。

注意:在所有平台上设置 IgnoreAction 的拖动光标可能不起作用。X11 和 macOS 已通过测试。Windows 不支持它。

参阅拖动光标

void QDrag::setHotSpot(const QPoint &hotspot)

设置相对像素图的左上角的热点位置。

注意:在上一个中,如果热点导致像素图直接显示在光标下面,像素图可能无法跟上鼠标的移动。

参阅热点

void QDrag::setMimeData(QMimeData *data)

设置要发送给指定 MIME data 的数据。数据的所有权将转移到 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

返回拖放操作的目标。这是放置拖动对象的控件。

[信号] void QDrag::targetChanged(QObject *newTarget)

当拖放操作的目标改变时,发出此信号,其中 newTarget 是新的目标。

另请参阅targetactionChanged

© 2024 The Qt Company Ltd. 本文档中的贡献是相应所有者的版权。本提供文档受自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款许可。Qt及其相关标志是芬兰和/或全世界 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。