@@ -44,6 +44,7 @@ struct DockFocusControllerPrivate
4444 QPointer<CFloatingDockContainer> FloatingWidget = nullptr ;
4545#endif
4646 CDockManager* DockManager;
47+ bool ForceFocusChangedSignal = false ;
4748
4849 /* *
4950 * Private data constructor
@@ -161,11 +162,12 @@ void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget)
161162 }
162163#endif
163164
164- if (old == DockWidget)
165+ if (old == DockWidget && !ForceFocusChangedSignal )
165166 {
166167 return ;
167168 }
168169
170+ ForceFocusChangedSignal = false ;
169171 if (DockWidget->isVisible ())
170172 {
171173 emit DockManager->focusedDockWidgetChanged (old, DockWidget);
@@ -243,15 +245,18 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge
243245 auto DockWidgetTab = qobject_cast<CDockWidgetTab*>(focusedNow);
244246 if (DockWidgetTab)
245247 {
246- DockWidget = DockWidgetTab->dockWidget ();
247- // If the DockWidgetTab "steals" the focus from a widget in the same
248- // DockWidget, then we immediately give the focus back to the previous
249- // focused widget focusedOld
250- if (DockWidget == d->FocusedDockWidget && focusedOld && focusedOld != focusedNow)
251- {
252- focusedOld->setFocus ();
253- return ;
254- }
248+ DockWidget = DockWidgetTab->dockWidget ();
249+ // If the DockWidgetTab "steals" the focus from a widget in the same
250+ // DockWidget, then we immediately give the focus back to the previous
251+ // focused widget focusedOld
252+ if (focusedOld)
253+ {
254+ auto OldFocusedDockWidget = internal::findParent<CDockWidget*>(focusedOld);
255+ if (OldFocusedDockWidget && OldFocusedDockWidget == DockWidget)
256+ {
257+ focusedOld->setFocus ();
258+ }
259+ }
255260 }
256261
257262 if (!DockWidget)
@@ -322,6 +327,7 @@ void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget)
322327 CDockWidget* DockWidget = qobject_cast<CDockWidget*>(DroppedWidget);
323328 if (DockWidget)
324329 {
330+ d->ForceFocusChangedSignal = true ;
325331 CDockManager::setWidgetFocus (DockWidget->tabWidget ());
326332 return ;
327333 }
@@ -333,6 +339,7 @@ void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget)
333339 }
334340
335341 DockWidget = DockArea->currentDockWidget ();
342+ d->ForceFocusChangedSignal = true ;
336343 CDockManager::setWidgetFocus (DockWidget->tabWidget ());
337344}
338345
0 commit comments