Question

J'ai un QMainWindow dans une application Qt. Lorsque je la ferme, je souhaite qu'il stocke sa taille de restauration actuelle (la taille de la fenêtre lorsqu'elle n'est pas agrandie). Cela fonctionne bien lorsque je ferme la fenêtre en mode restauration (c'est-à-dire non maximisée). Mais si je ferme la fenêtre si elle est agrandie, la prochaine fois que je lance l’application et que je la restaure (car elle démarre en mode agrandie), elle ne se souvient plus de la taille à restaurer. Y a-t-il un moyen de faire cela?

Était-ce utile?

La solution

Utilisez la fonctionnalité QWidget :: saveGeometry pour rédiger le texte actuel. paramètres dans le registre. (Le registre est accessible via QSettings). Ensuite, utilisez restoreGeometry () au démarrage pour revenir à l'état précédent.

Autres conseils

J'ai trouvé qu'une combinaison de toutes les réponses précédentes était nécessaire sur Fedora 14. Veillez à ne pas enregistrer la taille et la position lorsque la fenêtre est agrandie!

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

Dans main (), les paramètres de position sont lus avant que la fenêtre ne s'affiche pour la première fois ...

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

... et ces gestionnaires d'événements mettent à jour les paramètres si nécessaire. (Cela provoque une écriture dans le fichier de paramètres pour chaque mouvement de souris pendant le déplacement et le redimensionnement, ce qui n'est pas idéal.)

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

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

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

Malgré tout, la composante verticale de la position n’est pas tout à fait correcte, elle semble ignorer la hauteur de la barre de titre de la fenêtre ... si quelqu'un sait comment gérer cela, dites-le moi:)

J'ai aussi rencontré ce problème.

Ce que vous pouvez faire: en plus de la taille de la fenêtre, enregistrez si elle est agrandie ou non ( QWidget :: isMaximized () ).

Ensuite, lors du prochain démarrage de l'application, définissez d'abord la taille ( QWidget :: resize () ), puis agrandissez-la si nécessaire ( QWidget :: showMaximized () ) Une fois restauré, il devrait revenir à la taille correcte.

L'image sur http://qt-project.org/doc /qt-4.8/application-windows.html indique que geometry.x () et geometry.y () ne sont pas égaux à x () et y () , qui sont identiques à pos () .

Dans mon cas, j'utilise:

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

et restaurez-les avec succès avec:

move()
resize()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top