Qt-拖放事件与拖放操作

        拖放( drag and drop )操作是GUI应用程序中经常使用的一种操作,;例如将视频文件拖放到一个视频播放软件上,软件就可以播放此文件。本节学习拖放操作的基本原理,然后设置一个程序,程序可能接受从Windows资源管理器拖动来的PNG文件,并能显示图片。

        拖放操作相关事件

        拖放由两个操作组成:拖动( drag )和放置( drop ),被拖动的组件称为拖动点 ( drag site),接收拖动操作的组件叫做放置点 ( drop site ),拖动点与放置点可以是不同的组件,甚至是不同的应用程序,也可以是同一个组件,例如一个目录树内的节点的拖放操作。

        整个拖放操作可以分解为两个过程。
      (1)拖动点启动拖动操作,被拖动组件通过mousePressEvent()和mouseMoveEvent()这两个事件处理函数,检测到鼠标左键按下并移动时就可以启动拖动操作,启动拖动操作需要创造一个QDrag对象描述拖动操作,以及创建一个QMimeData类的对象用于存储拖动操作的格式信息和数据,并将其赋值为QDrag对象的mimeData属性。

     (2)放置点处理放置操作,当拖动操作移动到放置点范围时,首先触发dragEvent()事件处理函数,在此函数里一般要通过QDrag对象的mimeData数据判断拖动操作的来源和参数,以决定是否接受此拖动操作,只有被接受的拖动操作才可以被放置,并触发dropEvent()事件处理函数。函数dropEvent()用于处理放置时的具体操作,例如根据拖动来的文件类型执行相应的操作。

        从这个过程中可以看到,要实现完整的拖放操作需要对各种事件进行处理,拖动点和放置点最好是各自实现相关事件处理的类,如果要在同一个窗口上实现这些事件的处理,需要用到事件管理器。
        QWidget类有一个属性acceptDrops (accept—接受),如果设置为true,那么对应的这个组件就可以作为一个放置点,属性acceptDrops的默认值是false。QWidget类中没有定义拖动操作相关的函数,所以一般的界面组件是不能作为拖动点的。QAbstractItemView类定义了更多与拖动相关的函数,所以QListWidget,QTableWidget,QTreeWidget等组件既可以作为拖动点,也可以作为放置点。

整过拖动操作流程图

代码实现

函数acceptProposedAction()表示接受拖动操作,允许后续的放置操作。

函数ignore()表示不接受拖放操作,不允许后续的放置操作。

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值