2008-09-16 3 views
20

Tengo QMainWindow en una aplicación Qt. Cuando lo cierre, quiero que almacene su tamaño actual de restauración (el tamaño de la ventana cuando no está maximizado). Esto funciona bien cuando cierro la ventana en modo de restauración (es decir, no maximizado). Pero si cierro la ventana si está maximizada, la próxima vez que inicie la aplicación y restaure la aplicación (porque se inicia en modo maximizado), entonces no recuerda el tamaño en que debería restaurarse. ¿Hay alguna forma de hacer esto?¿Cómo guardo el tamaño de la ventana entre sesiones en Qt?

Respuesta

17

Utilice la función QWidget::saveGeometry para escribir la configuración actual en el registro. (Se puede acceder al registro usando QSettings). Luego use restoreGeometry() al inicio para regresar al estado anterior.

+2

Si también desea guardar las posiciones y el estado de dockwidgets, no solo el tamaño, debe usar QWidget :: saveState() – mtbkrdave

+1

Desafortunadamente, de esta manera no funciona para un caso cuando tiene una ventana maximizada en un segundo monitor (al menos en Windows 7). La geometría después de restaurar maximiza la ventana en el primer monitor. Uso el enfoque similar a la respuesta de iforce2d para resolver esto. –

+0

Nota: ya no hay 'QWidget :: saveState()'. Al menos, no está en Qt 4.8 o 5.7. 'saveState()' parece estar presente solo en 'QMainWindow'. – Len

4

He encontrado este problema también.

Qué puede hacer: además del tamaño de la ventana, guarde si está maximizado o no (QWidget::isMaximized()).

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

+0

funciona bien para mí, no importa si maximizada o no. Como la pregunta tiene 5 años, supongo que es por las actualizaciones de Qt. –

17

Encontré que una combinación de todas las respuestas anteriores aquí era necesaria en Fedora 14. ¡Tenga 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(), los ajustes de posición se leen antes de mostrar la ventana de la primera vez ...

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

... y estos controladores de eventos actualizar los ajustes según sea necesario. (Esto provoca una escritura en la configuración del archivo para cada movimiento del ratón durante el movimiento y cambiar el tamaño de los cuales no es ideal.)

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

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

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

Aún así, la componente vertical de la posición no es del todo bien, parece estar ignorando la altura de la barra de título de la ventana ... si alguien sabe cómo lidiar con eso, hágamelo saber :)

+0

excelente respuesta: ¡este código funciona como un encanto en Mac OSX!:-) al hacer algunas configuraciones al principio se elimina la duplicación de código cuando se accede a la configuración desde muchos lugares, consulte http://developer.qt.nokia.com/doc/qt-4.8/qsettings.html#basic-usage – ssc

+0

Intenté obtener es correcto, pero no se molestó en pasar tanto tiempo hasta que encontré el código de muestra que funciona como un amuleto. :) – Devolus

Cuestiones relacionadas