2008-09-16 7 views
20

J'ai une QMainWindow dans une application Qt. Lorsque je le ferme, je veux qu'il stocke sa taille de restauration actuelle (la taille de la fenêtre quand elle n'est pas agrandie). Cela fonctionne bien quand je ferme la fenêtre en mode de restauration (c'est-à-dire, pas maximisé). Mais si je ferme la fenêtre si elle est agrandie, la prochaine fois que je lance l'application et restaure l'application (car elle démarre en mode maximisé), elle ne se souvient pas de la taille à laquelle elle doit restaurer. Y a-t-il un moyen de faire cela?Comment stocker la taille de la fenêtre entre les sessions dans Qt?

Répondre

17

Utilisez la fonction QWidget::saveGeometry pour écrire les paramètres actuels dans le registre (le registre est accessible à l'aide de QSettings). Utilisez ensuite restoreGeometry() au démarrage pour revenir à l'état précédent.

+2

Si vous souhaitez également enregistrer les positions et le statut de dockwidgets, pas seulement la taille, vous devez utiliser QWidget :: saveState() – mtbkrdave

+1

Malheureusement, cette méthode ne fonctionne pas lorsque vous avez une fenêtre agrandie sur un second moniteur (au moins dans Windows 7). La géométrie après restauration maximise la fenêtre sur le premier moniteur. J'utilise l'approche similaire à la réponse de iforce2d pour résoudre ce problème. –

+0

Note: il n'y a plus de 'QWidget :: saveState()'. Au moins, ce n'est pas dans Qt 4.8 ou 5.7. 'saveState()' semble être présent uniquement sur 'QMainWindow'. – Len

4

J'ai également 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, la prochaine fois que vous démarrez l'application, définissez d'abord la taille (QWidget::resize()), puis agrandissez-la le cas échéant (QWidget::showMaximized()). Quand il est restauré, il devrait revenir à la bonne taille.

+0

fonctionne bien pour moi, peu importe si maximisé ou non. Puisque la question a 5 ans, je suppose que c'est à cause des mises à jour de Qt. –

17

J'ai trouvé qu'une combinaison de toutes les réponses précédentes ici était nécessaire sur Fedora 14. Soyez prudent pas pour 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(); 
} 

En main(), les réglages de position sont lus avant d'afficher la fenêtre la première fois ...

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

... et ces gestionnaires d'événements mettre à jour les paramètres nécessaires. (Cela provoque une écriture sur le fichier de paramètres pour chaque mouvement de la souris pendant le déplacement et redimensionnez qui n'est pas idéal.)

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

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

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

encore, la composante verticale de la position n'est pas tout à fait raison, il semble ignorer la hauteur de la barre de titre de la fenêtre ... si quelqu'un sait comment faire face à ce laissez-moi savoir :)

+0

bonne réponse - ce code fonctionne comme un charme sur Mac OSX!:-) faire quelques réglages à l'avant supprime la duplication du code lors de l'accès aux paramètres de nombreux endroits, voir http://developer.qt.nokia.com/doc/qt-4.8/qsettings.html#basic-usage – ssc

+0

J'ai essayé d'obtenir c'est vrai mais je n'ai pas pris la peine de passer autant de temps dessus, jusqu'à ce que je trouve ton code d'exemple qui fonctionne comme un charme. :) – Devolus

Questions connexes