Frage

Ich habe eine QMainWindow in einer Qt-Anwendung. Wenn ich es schließen will ich es seine aktuelle Größe wiederherstellen speichern (die Größe des Fensters, wenn es nicht maximiert ist). Das funktioniert gut, wenn ich das Fenster zu schließen Modus in wiederherzustellen (das heißt, nicht maximiert). Aber wenn ich das Fenster zu schließen, wenn es maximiert ist, dann beim nächsten Mal starten ich die Anwendung und Wiederherstellen der Anwendung (weil es in maximierten Modus gestartet wird), dann ist es nicht die Größe erinnern, um sie wiederherzustellen sollte. Gibt es eine Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Mit dem QWidget :: saveGeometry Funktion, um den Strom schreiben Einstellungen in der Registry. (die Registrierung mit QSettings zugegriffen wird). Dann nutzen restoreGeometry () beim Start in den vorherigen Zustand zurück.

Andere Tipps

Ich fand, dass eine Kombination aus allen bisherigen Antworten hier war notwendig, auf Fedora 14. Seien Sie vorsichtig nicht , um die Größe und Position zu speichern, wenn das Fenster maximiert ist!

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

In main () werden die Positionseinstellungen zu lesen, bevor das Fenster zum ersten Mal zeigen ...

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

... und diese Event-Handler die Einstellungen nach Bedarf aktualisieren. (Dies bewirkt, dass ein Schreiben in den Einstellungen für jede Mausbewegung während der Umzugs-Datei und die Größe, die nicht ideal ist.)

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

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

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

Dennoch ist die vertikale Komponente der Position nicht ganz richtig ist, so scheint es, die Höhe der Titelleiste des Fensters zu ignorieren ... wenn jemand weiß, wie er damit umgehen lassen Sie mich wissen:)

Ich habe dieses Problem auch auftreten.

Was Sie tun können: zusätzlich zu der Größe des Fensters, speichern, ob es maximiert ist oder nicht (QWidget::isMaximized()).

Dann nächste Mal, wenn Sie die Anwendung starten, zunächst die Größe (QWidget::resize()) bewegt und dann maximieren falls (QWidget::showMaximized()). Wenn es wieder hergestellt ist, sollte es auf die richtige Größe zurückzukehren.

Das Bild unter http://qt-project.org/doc /qt-4.8/application-windows.html zeigt, dass geometry.x() und geometry.y() nicht gleich x() und y(), die die gleiche wie pos() sind.

In meinem Fall, ich benutze:

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

und wiederherstellen dieser erfolgreich mit:

move()
resize()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top