Pregunta

Tengo una QMainWindow en una aplicación Qt.Cuando lo cierro quiero que almacene su tamaño de restauración actual (el tamaño de la ventana cuando no está maximizada).Esto funciona bien cuando cierro la ventana en modo de restauración (es decir, no maximizada).Pero si cierro la ventana si está maximizada, la próxima vez que inicie la aplicación y la restaure (porque se inicia en modo maximizado), no recordará el tamaño al que debe restaurar.¿Hay alguna forma de hacer esto?

¿Fue útil?

Solución

Utilizar el QWidget::guardarGeometría función para escribir la configuración actual en el registro. (Se accede al registro mediante QSettings).Luego use recoveryGeometry() al inicio para volver al estado anterior.

Otros consejos

Descubrí que era necesaria una combinación de todas las respuestas anteriores aquí en Fedora 14.Ten cuidado no para guardar el tamaño y la posición cuando la ventana está maximizada.

void MainWindow::writePositionSettings()
{
    QSettings qsettings( "iforce2d", "killerapp" );

    qsettings.beginGroup( "mainwindow" );

    qsettings.setValue( "geometry", saveGeometry() );
    qsettings.setValue( "savestate", saveState() );
    qsettings.setValue( "maximized", isMaximized() );
    if ( !isMaximized() ) {
        qsettings.setValue( "pos", pos() );
        qsettings.setValue( "size", size() );
    }

    qsettings.endGroup();
}

void MainWindow::readPositionSettings()
{
    QSettings qsettings( "iforce2d", "killerapp" );

    qsettings.beginGroup( "mainwindow" );

    restoreGeometry(qsettings.value( "geometry", saveGeometry() ).toByteArray());
    restoreState(qsettings.value( "savestate", saveState() ).toByteArray());
    move(qsettings.value( "pos", pos() ).toPoint());
    resize(qsettings.value( "size", size() ).toSize());
    if ( qsettings.value( "maximized", isMaximized() ).toBool() )
        showMaximized();

    qsettings.endGroup();
}

En main(), la configuración de posición se lee antes de mostrar la ventana por primera vez...

MainWindow mainWindow;
mainWindow.readPositionSettings();
mainWindow.show();

...y estos controladores de eventos actualizan la configuración según sea necesario.(Esto provoca que se escriba en el archivo de configuración para cada movimiento del mouse durante el movimiento y el cambio de tamaño, lo cual no es ideal).

void MainWindow::moveEvent( QMoveEvent* )
{
    writePositionSettings();
}

void MainWindow::resizeEvent( QResizeEvent* )
{
    writePositionSettings();
}

void MainWindow::closeEvent( QCloseEvent* )
{
    writePositionSettings();
}

Aún así, el componente vertical de la posición no es del todo correcto, parece estar ignorando la altura de la barra de título de la ventana...si alguien sabe como solucionarlo que me lo diga :)

También encontré este problema.

Lo que puedes hacer:además del tamaño de la ventana, guarde si está maximizada o no (QWidget::isMaximized()).

Luego, la próxima vez que inicie la aplicación, primero configure el tamaño (QWidget::resize()) y luego maximizarlo si corresponde (QWidget::showMaximized()).Cuando se restablezca, debería volver al tamaño correcto.

la imagen en http://qt-project.org/doc/qt-4.8/application-windows.html muestra, que geometry.x() y geometry.y() no son iguales a x() y y(), que son iguales que pos().

En mi caso uso:

x()
y()
width()
height()

y restaurarlos exitosamente con:

move()
resize()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top