Details
-
Bug
-
Resolution: Invalid
-
P4: Low
-
4.4.1
-
None
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() )
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();
}