Details
-
Bug
-
Resolution: Invalid
-
Not Evaluated
-
None
-
5.13.0
-
None
Description
I tried to implement an eventFilter for derived QTabWidget to catch DnD messages from its tabBar. dragEnter events is send nicely, but I do not receive dragLeave nor dragMove events until the dragEnter event has been accepted.
QExtTabWidget::QExtTabWidget(QWidget *parent) : QTabWidget(parent) { // Need to set acceptdrops for tabBar explicitely, else dragEnter event is never sent // to the tabBar itself but only to owning QTabWidget. This leads to the problem that // dragEnter event is not sent as when the cursor has been already in the tab widget. // So dragging something from inside the tab widget (e.g. from a client widget) to the tab widget's // tabbar triggers no dragEnter event. this->tabBar()->setAcceptDrops(true); // install event filter to intercept events sent to this widgets tabbar this->tabBar()->installEventFilter(this); } bool QExtTabWidget::eventFilter( QObject *target, QEvent *event) { if ( !(target == this->tabBar()) ) return false; if (event->type() == QEvent::DragEnter) { // need to accept the event, else QEvent::DragLeave and QEvent::DragMove won't be trigggered on the tabBar widget // and the code for dragMove and dragLeave below is never called QDragEnterEvent *dragEnterEvent = dynamic_cast<QDragEnterEvent*>(event); Q_ASSERT(dragEnterEvent != nullptr); // comment next line out to reproduce the issue dragEnterEvent->accept(); qDebug() << event->type(); return false; } else if ((event->type() == QEvent::DragLeave) || (event->type() == QEvent::Drop)) { qDebug() << event->type(); return false; } else if (event->type() == QEvent::DragMove) { qDebug() << event->type(); return false; } return false; }
dragEnter accept() switches the dragging cursor appearance too which is I do not want to. I think dragLeave and dragMove should be send/received independent of dragenter accept(). I aggree that possible drop event can depend on prior accept().