Pergunta

Eu tenho um QMainWindow em um aplicativo Qt.Ao fechá-lo, quero que ele armazene o tamanho da restauração atual (o tamanho da janela quando não está maximizada).Isso funciona bem quando fecho a janela no modo de restauração (ou seja, não maximizado).Mas se eu fechar a janela se ela estiver maximizada, da próxima vez que eu iniciar o aplicativo e restaurá-lo (porque ele inicia no modo maximizado), ele não se lembrará do tamanho para o qual deve restaurar.Existe uma maneira de fazer isso?

Foi útil?

Solução

Use o QWidget::saveGeometria recurso para gravar as configurações atuais no registro (o registro é acessado usando QSettings).Em seguida, use restoreGeometry() na inicialização para retornar ao estado anterior.

Outras dicas

Descobri que uma combinação de todas as respostas anteriores aqui era necessária no Fedora 14.Tome cuidado não para salvar o tamanho e a posição quando a janela estiver 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();
}

Em main(), as configurações de posição são lidas antes de mostrar a janela pela primeira vez...

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

...e esses manipuladores de eventos atualizam as configurações conforme necessário.(Isso causa gravações no arquivo de configurações para cada movimento do mouse durante a movimentação e redimensionamento, o que não é o ideal.)

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

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

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

Ainda assim, o componente vertical da posição não está correto, parece estar ignorando a altura da barra de título da janela...se alguém souber como lidar com isso me avise :)

Eu também encontrei esse problema.

O que você pode fazer:além do tamanho da janela, salve se ela está maximizada ou não (QWidget::isMaximized()).

Na próxima vez que você iniciar o aplicativo, primeiro defina o tamanho (QWidget::resize()) e então maximizá-lo se apropriado (QWidget::showMaximized()).Quando for restaurado, deverá retornar ao tamanho correto.

A imagem em http://qt-project.org/doc/qt-4.8/application-windows.html mostra que geometry.x() e geometry.y() não são iguais a x() e y(), que são iguais a pos().

No meu caso, eu uso:

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

e restaure-os com sucesso com:

move()
resize()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top