@@ -44,6 +44,7 @@ struct DockFocusControllerPrivate
44
44
QPointer<CFloatingDockContainer> FloatingWidget = nullptr ;
45
45
#endif
46
46
CDockManager* DockManager;
47
+ bool ForceFocusChangedSignal = false ;
47
48
48
49
/* *
49
50
* Private data constructor
@@ -161,11 +162,12 @@ void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget)
161
162
}
162
163
#endif
163
164
164
- if (old == DockWidget)
165
+ if (old == DockWidget && !ForceFocusChangedSignal )
165
166
{
166
167
return ;
167
168
}
168
169
170
+ ForceFocusChangedSignal = false ;
169
171
if (DockWidget->isVisible ())
170
172
{
171
173
emit DockManager->focusedDockWidgetChanged (old, DockWidget);
@@ -243,15 +245,18 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge
243
245
auto DockWidgetTab = qobject_cast<CDockWidgetTab*>(focusedNow);
244
246
if (DockWidgetTab)
245
247
{
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
+ }
255
260
}
256
261
257
262
if (!DockWidget)
@@ -322,6 +327,7 @@ void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget)
322
327
CDockWidget* DockWidget = qobject_cast<CDockWidget*>(DroppedWidget);
323
328
if (DockWidget)
324
329
{
330
+ d->ForceFocusChangedSignal = true ;
325
331
CDockManager::setWidgetFocus (DockWidget->tabWidget ());
326
332
return ;
327
333
}
@@ -333,6 +339,7 @@ void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget)
333
339
}
334
340
335
341
DockWidget = DockArea->currentDockWidget ();
342
+ d->ForceFocusChangedSignal = true ;
336
343
CDockManager::setWidgetFocus (DockWidget->tabWidget ());
337
344
}
338
345
0 commit comments