diff options
author | jian liang <jianliang79@gmail.com> | 2012-09-25 21:33:55 +0800 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-09-27 23:51:30 +0200 |
commit | 0a7e8350ae0a461d90619382c61e933eb0494be9 (patch) | |
tree | 44f222e2ac1c733f28e9e201be9af0eb2a70c964 /src/widgets/kernel | |
parent | f9547c89ea9fd0e6d571db840c5cadab079df607 (diff) |
Fix drag and drop with native widgets
Task-number: QTBUG-27336
Don't check 'widget != m_widget' in
QWidgetWindow::handleDragEnterMoveEvent() since the current window's
parent widget may be the actual drop target. I replace it with a check
'!widget->isWindow()' to prevent we pass through a top level window.
I also change 'widget->mapFrom(m_widget, event->pos())' to
'widget->mapFromGlobal(m_widget->mapToGlobal(event->pos()))' since m_widget
may not be widget's parent.
Change-Id: Ia4f10f85ccdf1e27223ddc51afabd98b5d16f2fb
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index ad4b9c928d..10ec4d3745 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -443,13 +443,13 @@ void QWidgetWindow::handleDragEnterMoveEvent(QDragMoveEvent *event) QWidget *widget = m_widget->childAt(event->pos()); if (!widget) widget = m_widget; - for ( ; widget && widget != m_widget && !widget->acceptDrops(); widget = widget->parentWidget()) ; + for ( ; widget && !widget->isWindow() && !widget->acceptDrops(); widget = widget->parentWidget()) ; if (widget && !widget->acceptDrops()) widget = 0; // Target widget unchanged: DragMove if (widget && widget == m_dragTarget.data()) { Q_ASSERT(event->type() == QEvent::DragMove); - const QPoint mapped = widget->mapFrom(m_widget, event->pos()); + const QPoint mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->pos())); QDragMoveEvent translated(mapped, event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers()); translated.setDropAction(event->dropAction()); QGuiApplication::sendSpontaneousEvent(widget, &translated); @@ -472,7 +472,7 @@ void QWidgetWindow::handleDragEnterMoveEvent(QDragMoveEvent *event) return; } m_dragTarget = widget; - const QPoint mapped = widget->mapFrom(m_widget, event->pos()); + const QPoint mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->pos())); QDragEnterEvent translated(mapped, event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers()); QGuiApplication::sendSpontaneousEvent(widget, &translated); if (translated.isAccepted()) { @@ -492,7 +492,7 @@ void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event) void QWidgetWindow::handleDropEvent(QDropEvent *event) { - const QPoint mapped = m_dragTarget.data()->mapFrom(m_widget, event->pos()); + const QPoint mapped = m_dragTarget.data()->mapFromGlobal(m_widget->mapToGlobal(event->pos())); QDropEvent translated(mapped, event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers()); QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), &translated); if (translated.isAccepted()) |