首页 > 其他 > 详细

QT 鼠标拖拽

时间:2014-02-28 16:22:25      阅读:857      评论:0      收藏:0      [点我收藏+]


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

本文出自 “一世绝影” 博客,请务必保留此出处http://hellolzx.blog.51cto.com/8594395/1364631

QT 鼠标拖拽,布布扣,bubuko.com

QT 鼠标拖拽

原文:http://hellolzx.blog.51cto.com/8594395/1364631

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!