现象:

   要实现以拖拽的方式在场景中添加图元的功能,很自然地想到重写QGraphicsScene的dropEvent函数,然后在dropEvent中根据drag携带的数据来添加相应的图元对象。然而事情并没有想象的那么顺利,运行程序后执行拖拽到场景时光标显示的是禁止的图片,重写的dropEvent并没有执行。


原因:

    起初以为是没有调用视图(QGraphicsView)的setAcceptDrops。然而调用了也没啥用。真正的原因其实是QGraphicsScene在dragMoveEvent中忽略了拖拽事件,其源码如下:

image.png


解决办法:

    重写dragMoveEvent接受拖拽事件:

image.png


    实际上event->accept()也没必要写,因为只要不忽略掉event,它都会继续往下传。