QT 鼠标拖拽 


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

你可能感兴趣的:(QT 拖拽)