DragWidget类定义:
class DragWidget : public QFrame
{
public:
DragWidget(QWidget *parent = 0);
protected:
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
void mousePressEvent(QMouseEvent *event);
};
QLabel 类提供了我们需要的大部分的图标,我们只需要重写 QWidget:mousePressEvent ()提供拖放功能。
DragWidget类的实现:
DragWidget::DragWidget(QWidget *parent)
: QFrame(parent)
{
setMinimumSize(200, 200);
setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
setAcceptDrops(true);
QLabel *boatIcon = new QLabel(this);
boatIcon->setPixmap(QPixmap("/root/1.jpg"));
boatIcon->move(10, 10);
boatIcon->show();
boatIcon->setAttribute(Qt::WA_DeleteOnClose);
}
拖动图标,鼠标按下事件我们需要采取行动。
我们通过重新实现 QWidget:mousePressEvent ()和设置 QDrag 对象。
void DragWidget::mousePressEvent(QMouseEvent *event)
{
QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if (!child)
return;
QPixmap pixmap = *child->pixmap();
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->pos() - child->pos());
因为我们点击图片将发送图标和位图数据信息,我们构造一个 QByteArray 和包的使用细节 QDataStream 。 在Qt中,我们描述这些数据使用 QMimeData 对象:
为此,我们选择一个非官方的MIME类型和供应 QByteArray MIME数据对象。
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-dnditemdata", itemData);
拖放操作本身是由一个处理 QDrag 对象:
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - child->pos());
在这里,我们通过拖动对象的数据,设置一个象素映射,将显示与光标操作期间,并定义一个热点的位置,这象图在光标的位置。
demo 下载地址:http://down.51cto.com/data/1091523