#include "dialog.h" #include #include #include #include #include #include #include #include #include #include class Scene : public QGraphicsScene { public: void dragMoveEvent( QGraphicsSceneDragDropEvent* event ) override { bool acceptOnBlank = true; if( acceptOnBlank || itemAt( event->scenePos(), QTransform() ) ) // if item under cursor the event should be propagated further { event->accept(); } else { QGraphicsScene::dragMoveEvent( event ); } } }; class Widget : public QWidget { public: Widget() : QWidget( nullptr ) { setAcceptDrops( true ); QHBoxLayout* mainLayout = new QHBoxLayout; mainLayout->addWidget( new QLabel( "TEST" ) ); setLayout( mainLayout ); } void mouseMoveEvent( QMouseEvent* event ) { if( !( event->buttons() & Qt::LeftButton ) ) { event->accept(); return; } if( ( event->pos() - mDragStartPosition ).manhattanLength() < QApplication::startDragDistance() ) { event->accept(); return; } QDrag* drag = new QDrag( this ); QMimeData* mimeData = new QMimeData; drag->setMimeData( mimeData ); QPixmap pixmap( this->rect().size() ); this->render( &pixmap, QPoint(), this->rect() ); drag->setPixmap( pixmap ); drag->exec(); } void mousePressEvent( QMouseEvent *event ) { if( event->button() == Qt::LeftButton ) { mDragStartPosition = event->pos(); } event->accept(); } public: QPointF mDragStartPosition; }; class Proxy : public QGraphicsProxyWidget { public: Proxy() : QGraphicsProxyWidget( nullptr ) { setFlag( QGraphicsItem::ItemIsMovable, true ); setFlag( QGraphicsItem::ItemIsSelectable, true ); setAcceptDrops( true ); setWidget( new Widget ); } void dragLeaveEvent( QGraphicsSceneDragDropEvent* /*event*/ ) override { qDebug() << "dragLeaveEvent"; } }; Dialog::Dialog(QWidget *parent) : QDialog(parent) { QGraphicsScene* scene = new Scene(); QGraphicsView* sceneView = new QGraphicsView; sceneView->setScene( scene ); QHBoxLayout* mainLayout = new QHBoxLayout; mainLayout->addWidget( sceneView ); setLayout( mainLayout ); // Add Items scene->addItem( new Proxy ); } Dialog::~Dialog() { }