Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-3748

QTreeWidget: Catch Drag'n'Drop Events with EventFilter

    XMLWordPrintable

Details

    Description

      Using the example provided below I tried to catch the QEvent::Drop event from a QTreeWidget with an eventFilter.

      When I drag and drop an item from list1 to list2, I expected the events "DragEnter", "DragMove" and "Drop" (thrown by the QTreeWidget "list2").

      The QLineEdit is just there for demonstrating a working eventfilter...

      Instead there is just a "DragEnter"-Event sometimes.. no DragMove and never a "Drop" Event

      Example Code:

      // eventhandler.h
      #include <QObject>
      #include <QPlainTextEdit> // just for logging
      class DragDropHandler : public QObject {
      Q_OBJECT
      public:
      DragDropHandler( QObject *parent, QPlainTextEdit *p_debugPlainTextEdit_ );
      protected:
      bool eventFilter( QObject *obj, QEvent *event );
      private:
      QPlainTextEdit *mp_debugPlainTextEdit;
      };

      // eventhandler.cc
      #include "eventhandler.h"
      #include <QString>
      DragDropHandler::DragDropHandler( QObject *parent, QPlainTextEdit *p_debugPlainTextEdit_ )
      : QObject( parent ), mp_debugPlainTextEdit( p_debugPlainTextEdit_ )
      {
      }

      bool DragDropHandler::eventFilter( QObject *obj, QEvent *event ) {
      QString z;
      if( event->type() == QEvent::DragEnter )
      z += "DragEnter";
      if( event->type() == QEvent::DragMove )
      z += "DragMove";
      if( event->type() == QEvent::DragLeave )
      z += "DragLeave";
      if( event->type() == QEvent::Drop )
      z += "Drop";
      if( !z.isEmpty() )

      { mp_debugPlainTextEdit->insertPlainText( obj->objectName() + ": " + z + '\n' ); mp_debugPlainTextEdit->moveCursor( QTextCursor::End ); }

      return QObject::eventFilter(obj, event);
      }

      // main.cc
      #include "eventhandler.h"

      #include <QtGui>

      int main( int argc, char **argv )
      {

      QApplication app( argc, argv );

      QMainWindow w;

      w.resize( 600, 400 );

      // eventlogs

      QPlainTextEdit *debugPlainTextEdit = new QPlainTextEdit( &w );

      // event handler

      DragDropHandler *handler = new DragDropHandler( &w, debugPlainTextEdit );

      // QListWidgets

      QListWidget *listWidget1 = new QListWidget( &w );

      listWidget1->setObjectName( "listWidget1" );

      listWidget1->installEventFilter( handler );

      listWidget1->setDragEnabled( true );

      listWidget1->setAcceptDrops( true );

      listWidget1->setDropIndicatorShown( true );

      listWidget1->setDragDropMode( QAbstractItemView::DragDrop );

      listWidget1->viewport()->setAcceptDrops(true);

      QListWidget *listWidget2 = new QListWidget( &w );

      listWidget2->setObjectName( "listWidget2" );

      listWidget2->installEventFilter( handler );

      listWidget2->setDragEnabled( true );

      listWidget2->setAcceptDrops( true );

      listWidget2->setDropIndicatorShown( true );

      listWidget2->setDragDropMode( QAbstractItemView::DragDrop );

      // QLineEdit

      QLineEdit *lineEdit1 = new QLineEdit( &w );

      lineEdit1->setObjectName( "lineEdit1" );

      lineEdit1->installEventFilter( handler );

      lineEdit1->setDragEnabled( true );

      lineEdit1->setAcceptDrops( true );

      // Sampledata

      QStringList data;

      for( int i = 0; i < 6; i++ )

      data << "Test " + QString::number( i );

      listWidget1->addItems( data );

      listWidget2->addItems( data );

      lineEdit1->setText( data.join( " " ) );

      // Layout

      QWidget *centralwidget = new QWidget( &w );

      w.setCentralWidget( centralwidget );

      QGridLayout *gridLayout = new QGridLayout( centralwidget );

      centralwidget->setLayout( gridLayout );

      QLabel *label1 = new QLabel( "List1", &w );

      QLabel *label2 = new QLabel( "List2", &w );

      QLabel *label3 = new QLabel( "DragEnter/DragMove/DragLeave/Drop/DragResponse", &w );

      gridLayout->addWidget( label1, 0, 0 );

      gridLayout->addWidget( label2, 0, 1 );

      gridLayout->addWidget( label3, 0, 2 );

      gridLayout->addWidget( listWidget1, 1, 0 );

      gridLayout->addWidget( listWidget2, 1, 1 );

      gridLayout->addWidget( lineEdit1, 2, 0 );

      gridLayout->addWidget( debugPlainTextEdit, 1, 2, 3, 1 );

      w.show();

      return app.exec();

      }

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            bhughes Bradley T. Hughes (closed Nokia Identity) (Inactive)
            janichol Andy Nichols
            Votes:
            1 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes