Re: QMainWindow::restoreState doesn't bring floating QDockWidgets to the front
A floating dock widget is not automatically brought in front of existing windows from other applications when restoring main window state
I am using QMainWindow::restoreState() at application startup to successfully restore undocked QDockWidgets to their floating position.
The issue I have is that while QMainWindow is brought to the front, the floating QDockWidget is not.
This is illustrated by having a terminal window open, and starting my application from the command line.
If the floating QDockWidget is restored to a position that is in the same region as the terminal window, then it comes up below the terminal window. I have to move the terminal to reveal the QDockWidget.
Work around:
I have a work around in that I call QWidget::activateWindow() on the QDockWidget to bring it in front of my terminal, and then on the QMainWindow so that this is the active window, which would probably be the expected behaviour.
Code:
void App::show()
{
_table->setObjectName("table");
_main->addDockWidget(Qt::RightDockWidgetArea, _table);
_main->restoreState();
_table->activateWindow(); // bring QDockWidget to the front
_main->activateWindow(); // make QMainWindow the active window
_main->show();
}
If I don't use QWidget::activateWindow() on the QDockWidget, then it's hidden behind the existing terminal window.
Is it possible to get this behaviour without having to iterate over all widgets calling QWidget::activateWindow()? As the number of widgets grows it will get somewhat onerous.
Added after 13 minutes:
I have made a somewhat feasible workaround by inheriting QMainWindow and overriding QMainWindow::show()
Code:
void MyMainWindow::show()
{
QList<QDockWidget*> dock_widgets = findChildren<QDockWidget*>();
{
dock_widget->activateWindow();
}
activateWindow();
}
It still seems a bit broken though
Added after 1 25 minutes:
Fixed!
The problem is restoring state before showing the window
Code:
void App::show()
{
_table->setObjectName("table");
_main->addDockWidget(Qt::RightDockWidgetArea, _table);
_main->show();
_main->restoreState(); // only restore state **after** showing the window
}