From a9edbeddafe5d8866192de44f4028d07bd93013a Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 14 Nov 2013 14:57:50 +0100 Subject: When reparenting a widget, children need to reregister as a drop site If a widget is a drop site and an ancestor gets reparented then the widget needs to be reregistered as a drop site so that it is correctly associated with the new native parent widget. Task-number: QTBUG-30276 Change-Id: I440077e54f614d0bfbaef46104de6598411c986b Reviewed-by: Friedemann Kleint --- src/gui/kernel/qwidget_win.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp index 9419226..c90cd9c 100644 --- a/src/gui/kernel/qwidget_win.cpp +++ b/src/gui/kernel/qwidget_win.cpp @@ -631,7 +631,15 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f) dropSiteWasRegistered = true; q->setAttribute(Qt::WA_DropSiteRegistered, false); // ole dnd unregister (we will register again below) } - + QList registeredDropChildren; + if (QWidget *nativeParent = q->internalWinId() ? q : q->nativeParentWidget()) { + foreach (QWidget *w, nativeParent->d_func()->extra->oleDropWidgets) { + if (w && q->isAncestorOf(w)) { + registeredDropChildren.push_back(w); + w->setAttribute(Qt::WA_DropSiteRegistered, false); + } + } + } if ((q->windowType() == Qt::Desktop)) old_winid = 0; setWinId(0); @@ -684,6 +692,8 @@ void QWidgetPrivate::setParent_sys(QWidget *parent, Qt::WindowFlags f) if (q->testAttribute(Qt::WA_AcceptDrops) || dropSiteWasRegistered || (!q->isWindow() && q->parentWidget() && q->parentWidget()->testAttribute(Qt::WA_DropSiteRegistered))) q->setAttribute(Qt::WA_DropSiteRegistered, true); + foreach (QWidget *w, registeredDropChildren) + w->setAttribute(Qt::WA_DropSiteRegistered, true); #ifdef Q_WS_WINCE // Show borderless toplevel windows in tasklist & NavBar -- cgit v0.12