Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. DropEvent is not getting called for QGraphicsScene

DropEvent is not getting called for QGraphicsScene

Scheduled Pinned Locked Moved General and Desktop
5 Posts 3 Posters 7.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    durgeshK
    wrote on last edited by
    #1

    Hello everyone,

    I have sub classed QGraphicsScene to implement the Drag and Drop feature. Now when i start a drag event form another widget(another QGraphicsView), all events related to dragging, i.e., dragEnterEvent, dragMoveEvent and dragLeaveEvent are getting called, but dropEvent is not getting called.

    Any Suggestion?

    1 Reply Last reply
    0
    • S Offline
      S Offline
      shint
      wrote on last edited by
      #2

      hi. durgeshK.
      i tryed. QGraphicsView and drag & drop. in qt src.
      this code is very simple.
      C:\Qt\2010.05\qt\examples\draganddrop\dropsite

      and. i received drop event.

      //code.
      //---------------------------------------------------------
      <step 1> create class - i make gview.cpp gview.h (QWidget)
      //---------------------------------------------------------
      <step 2> i make ui. (use Qt designer)
      //---------------------------------------------------------

      • create QGraphicsView.
      • mouse right click - Promoted widgets
      • base QGraphicsView
      • class gview [add btn click]
      • [Promoted click]

      //---------------------------------------------------------
      <step 3> copy & paste this code.
      //---------------------------------------------------------
      //gview.h
      @
      #ifndef GVIEW_H
      #define GVIEW_H

      #include <QWidget>
      #include <QGraphicsView>

      QT_BEGIN_NAMESPACE
      class QMimeData;
      QT_END_NAMESPACE

      class gview : public QGraphicsView
      {
      Q_OBJECT
      public:
      explicit gview(QWidget *parent = 0);

      public slots:
      void clear();

      signals:
      void changed(const QMimeData *mimeData = 0);

      protected:
      void dragEnterEvent(QDragEnterEvent *event);
      void dragMoveEvent(QDragMoveEvent *event);
      void dragLeaveEvent(QDragLeaveEvent *event);
      void dropEvent(QDropEvent *event);
      };

      #endif // GVIEW_H
      @

      //gview.cpp
      @
      #include "gview.h"

      #include <QtGui>

      gview::gview(QWidget *parent)
      : QGraphicsView(parent)
      {
      setMinimumSize(200, 200);
      setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
      setAlignment(Qt::AlignCenter);
      setAcceptDrops(true);
      setAutoFillBackground(true);
      //s clear();
      }

      void gview::dragEnterEvent(QDragEnterEvent *event)
      {
      //s setText(tr("<drop content>"));
      setBackgroundRole(QPalette::Highlight);

      event->acceptProposedAction();
      emit changed(event->mimeData());
      

      }

      void gview::dragMoveEvent(QDragMoveEvent *event)
      {
      event->acceptProposedAction();
      }

      void gview::dropEvent(QDropEvent *event)
      {
      const QMimeData *mimeData = event->mimeData();

      if (mimeData->hasImage()) {
      

      //s setPixmap(qvariant_cast<QPixmap>(mimeData->imageData()));
      } else if (mimeData->hasHtml()) {
      //s setText(mimeData->html());
      //s setTextFormat(Qt::RichText);
      } else if (mimeData->hasText()) {
      //s setText(mimeData->text());
      //s setTextFormat(Qt::PlainText);
      } else if (mimeData->hasUrls()) {
      QList<QUrl> urlList = mimeData->urls();
      QString text;
      for (int i = 0; i < urlList.size() && i < 32; ++i) {
      QString url = urlList.at(i).path();
      text += url + QString("\n");
      }
      //s setText(text);
      } else {
      //s setText(tr("Cannot display data"));
      }
      setBackgroundRole(QPalette::Dark);
      event->acceptProposedAction();
      }

      void gview::dragLeaveEvent(QDragLeaveEvent *event)
      {
      //s clear();
      event->accept();
      }

      void gview::clear()
      {
      // setText(tr("<drop content>"));
      setBackgroundRole(QPalette::Dark);

      emit changed();
      

      }

      @

      1 Reply Last reply
      0
      • D Offline
        D Offline
        durgeshK
        wrote on last edited by
        #3

        Hi Shint,

        Thanks for the code. But again i am facing the same problem, even your code is working fine for drags from outside the application, but dropEvent is again not being called if a drag is initiated from within the application.

        I have two graphicsView, the one acting as a source and other as a destination. Here everything is working fine except that the dropEvent is not being called when i release the mouse.

        1 Reply Last reply
        0
        • D Offline
          D Offline
          durgeshK
          wrote on last edited by
          #4

          Hi again Shint,

          Your code is working fine, the problem was at my end while executing the drag.
          Earlier i was using @drag->exec(Qt::IgnoreAction)@, so the dropEvent call was ignored. Now when i am using @drag->exec()@, everything works fine.(Even my code :) ).

          Thanks & Regards,
          Durgesh

          1 Reply Last reply
          0
          • V Offline
            V Offline
            venkatesh
            wrote on last edited by
            #5

            Hi,
            I know this is old post, but i tried to implement this in my application. I am not able to correctly do get the display. Though i am not getting any error. if i enable a
            @ QGraphicsPixmapItem(item) or
            GraphicsPixmapItem *item

            item->setPixmap(.....); @

            But the image is not getting displayed in my QGraphicsView created by the QTDesigner. Would love to have your suggestions. Should i add any code to my widget.cpp to connect the gview.h other than steps mentioned here.

            Regards
            Venkatesh

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved