2008-09-16 16 views
20

Ich habe ein QMainWindow in einer Qt-Anwendung. Wenn ich es schließe, möchte ich, dass es seine aktuelle Wiederherstellungsgröße speichert (die Größe des Fensters, wenn es nicht maximiert ist). Dies funktioniert gut, wenn ich das Fenster im Wiederherstellungsmodus schließe (dh nicht maximiert). Aber wenn ich das Fenster schließe, wenn es maximiert ist, dann beim nächsten Mal, wenn ich die Anwendung starte und die Anwendung wiederherstelle (weil sie im maximierten Modus startet), dann merkt sie sich nicht die Größe, auf die sie wiederherstellen soll. Gibt es eine Möglichkeit, dies zu tun?Wie speichere ich die Fenstergröße zwischen Sitzungen in Qt?

Antwort

17

Verwenden Sie die Funktion QWidget::saveGeometry, um die aktuellen Einstellungen in die Registrierung zu schreiben (auf die Registrierung wird mit QSettings zugegriffen). Verwenden Sie dann restoreGeometry() beim Start, um zum vorherigen Zustand zurückzukehren.

+2

Wenn Sie auch die Positionen und den Status von Dockwidgets speichern möchten, nicht nur die Größe, sollten Sie QWidget :: saveState() verwenden – mtbkrdave

+1

Leider funktioniert diese Methode nicht für einen Fall, wenn Sie ein maximiertes Fenster auf einem zweiten Monitor haben (zumindest in Windows 7). Die Geometrie nach dem Wiederherstellen maximiert das Fenster auf dem ersten Monitor. Ich benutze den ähnlichen Ansatz wie iforce2d, um das Problem zu lösen. –

+0

Hinweis: Es gibt kein 'QWidget :: saveState()' mehr. Zumindest ist es nicht in Qt 4.8 oder 5.7. 'saveState()' scheint nur in 'QMainWindow' vorhanden zu sein. – Len

4

Ich habe dieses Problem auch gefunden.

Was Sie tun können: Speichern Sie neben der Größe des Fensters, ob es maximiert ist oder nicht (QWidget::isMaximized()).

Wenn Sie das nächste Mal die Anwendung starten, stellen Sie zunächst die Größe ein (QWidget::resize()) und maximieren Sie sie gegebenenfalls (QWidget::showMaximized()). Wenn es wiederhergestellt wird, sollte es auf die richtige Größe zurückkehren.

+0

funktioniert gut für mich, egal ob maximiert oder nicht. Da die Frage 5 Jahre alt ist, nehme ich an, dass es wegen Qt Updates ist. –

17

Ich fand, dass eine Kombination aller vorherigen Antworten hier auf Fedora 14 notwendig war. 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 ignoriert werden Höhe der Titelleiste des Fensters ... wenn jemand weiß, wie er damit umgehen mich bei http://qt-project.org/doc/qt-4.8/application-windows.html zeigt :)

+0

großartige Antwort - dieser Code funktioniert wie ein Zauber auf Mac OSX!:-) ein paar Einstellungen vorne zu tun entfernt Code-Duplizierung beim Zugriff auf Einstellungen von vielen Orten, siehe http://developer.qt.nokia.com/doc/qt-4.8/qsettings.html#basic-usage – ssc

+0

Ich versuchte zu bekommen Es war richtig, aber ich habe mich nicht damit beschäftigt, so viel Zeit damit zu verbringen, bis ich deinen Beispielcode gefunden habe, der wie ein Zauber wirkt. :) – Devolus

0

das Bild wissen lassen, dass geometry.x() und geometry.y() zu x() und y() nicht gleich sind, die die gleiche wie pos() sind .

In meinem Fall, ich benutze:

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

und wiederherstellen diese erfolgreich mit:

move() 
resize()