不二如是 发表于 2016-10-12 15:14:58

78-自定义图片拖放-77细化说明1

本帖最后由 不二如是 于 2016-10-12 16:07 编辑

在77,历经千难万险。。。

终于搞定了一个实现简单图片拖放功能的小程序,有几个地方需要好好的、慢慢的、一点一点的梳理下{:10_297:}

这里我们主要从鼠标按下图片开始说起:

当鼠标按下时会触发鼠标按下事件(mousePressEvent(QMouse * event)),然后就进行了一系列的操作。

大体分为6步~

第一步,把冰箱门儿打开。。。

哈哈,放松下心情~

不要质疑“不二,你是逗b吗?”

不二就是逗b{:10_288:}

言归正传,言归正传~


[*]获取鼠标指针所在处的部件的指针

将获取的指针强制转换为QLabel类型的指针,然后使用inherits()函数判断他是否是QLabel类型,如果不是直接返回,不再进行下面操作。

[*]使用自定义的MIME类型

因为不仅要在拖动的数据中包含图片数据,还要包含他的位置信息,所以要自定义MIME类型。

这里使用了QByteArray字节数组来存放图片数据和位置数据。

然后使用QDataStream类将数据写入数组中。

其中,位置信息是当前鼠标指针的坐标减去图片左上角的坐标而得到的差值,很简单,左上角相当于图片的坐标。


[*]创建QMimeData类对象指针

使用自定义的MIME类型"myimage/png",将字节数组放入QMimeData中。

[*]创建QDrag类对象

为了移动数据,必须创建QDrag类对象,然后为其添加QMimeData数据。

这里在移动过程中一直要显示图片,需要使用setPixmap()函数为其设置图片。

而setPixmap()函数接收png类型图片。

然后使用setHotSpot()函数指定了鼠标在图片上单击的位置,相当于图片左上角的位置;

如果不设定,那么拖动过程,指针回味与图片的左上角。

[*]添加一层阴影,表示效果

在移动过程中,为了演示效果,我们让原来的图片有所改变表示其正在被操作,所以加了一层阴影。

[*]执行拖动操作

使用QDrag类的exec()函数,他不会影响主要事件循环,所以界面不会被冻结。

当图片被放下后exec()函数就会返回操作类型,这个返回值在下面dropEvent()就是在79解释的函数中设定。



关于第6步里面Qt::CopyAction的一点说明:

if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction) == Qt::MoveAction)

这个函数可以设定所支持的放下动作和默认的放下动作。

比如这里设置了支持复制操作Qt::CopyAction和移动动作Qt::MoveAction,并设置默认动作是复制。

这就表示,当我们拖动图片,我们执行了复制操作。

而不是,移动操作。


页: [1]
查看完整版本: 78-自定义图片拖放-77细化说明1