c++qtsplash-screenqwidget

How to get screen number from saved geometry?


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?


Solution

  • 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);
    }