In order to restore last window geometry and state, I'm using a code similar to the one suggested in this Qt document:
void MainWindow::closeEvent(QCloseEvent *event)
{
QSettings settings("MyCompany", "MyApp");
settings.setValue("geometry", saveGeometry());
QMainWindow::closeEvent(event);
}
void MainWindow::readSettings()
{
QSettings settings("MyCompany", "MyApp");
restoreGeometry(settings.value("geometry").toByteArray());
}
Looking at Qt's source code (qwidget.cpp), QWidget::saveGeometry
and its sibling restoreGeometry
are basically a serialization of geometry, screen number and window state.
Now, the application shows a splash screen during start up. I'd like to show such splash screen in the same monitor where the application's window will be displayed. I can set splash screen geometry based on QScreen
geometry, but I need the screen number to complete this code:
const auto screens = qApp->screens();
const auto geometry = screens[/* screen number here */]->geometry();
How can I get only the screen number from the saved geometry?
I've been able to solve the issue creating a fake QWidget
(never shown), restoring its geometry, and using QDesktopWidget::screenNumber
to get the monitor where it is supposed to be:
int MainWindow::getMonitorToShowSplashScreen() const
{
QSettings settings("MyCompany", "MyApp");
QWidget fake_widget;
fake_widget.restoreGeometry(settings.value("geometry").toByteArray());
return qApp->desktop()->screenNumber(&fake_widget);
}