Domanda

Ho una QMainWindow in un'applicazione Qt.Quando lo chiudo, voglio che memorizzi la dimensione di ripristino corrente (la dimensione della finestra quando non è ingrandita).Funziona bene quando chiudo la finestra in modalità di ripristino (ovvero non ingrandita).Ma se chiudo la finestra se è ingrandita, la prossima volta che avvio l'applicazione e la ripristino (perché si avvia in modalità ingrandita), non ricorda la dimensione a cui dovrebbe ripristinare.C'è un modo per fare questo?

È stato utile?

Soluzione

Usa il QWidget::saveGeometry funzione per scrivere le impostazioni correnti nel registro. (È possibile accedere al registro utilizzando QSettings).Quindi utilizzare RestoreGeometry() all'avvio per tornare allo stato precedente.

Altri suggerimenti

Ho scoperto che su Fedora 14 era necessaria una combinazione di tutte le risposte precedenti qui.Stai attento non per salvare la dimensione e la posizione quando la finestra è ingrandita!

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(), le impostazioni di posizione vengono lette prima di mostrare la finestra per la prima volta...

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

...e questi gestori di eventi aggiornano le impostazioni secondo necessità.(Ciò causa una scrittura nel file delle impostazioni per ogni movimento del mouse durante lo spostamento e il ridimensionamento, il che non è l'ideale.)

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

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

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

Tuttavia, la componente verticale della posizione non è del tutto corretta, sembra che ignori l'altezza della barra del titolo della finestra...se qualcuno sa come affrontare la cosa me lo faccia sapere :)

Anch'io ho riscontrato questo problema.

Cosa puoi fare:oltre alle dimensioni della finestra, salva se è ingrandita o meno (QWidget::isMaximized()).

La prossima volta che avvii l'applicazione, imposta prima la dimensione (QWidget::resize()) e quindi massimizzarlo se appropriato (QWidget::showMaximized()).Una volta ripristinato, dovrebbe tornare alla dimensione corretta.

L'immagine a http://qt-project.org/doc/qt-4.8/application-windows.html mostra che geometry.x() E geometry.y() non sono uguali a x() E y(), che sono gli stessi di pos().

Nel mio caso, utilizzo:

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

e ripristinarli con successo con:

move()
resize()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top