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
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.
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.
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. –
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 :)
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
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
l'image à http://qt-project.org/doc/qt-4.8/application-windows.html montre que geometry.x()
et geometry.y()
ne sont pas égaux à x()
et y()
, qui sont les mêmes que pos()
.
Dans mon cas, j'utilise:
x()
y()
width()
height()
et restaurer ces avec succès:
move()
resize()
- 1. la taille de la fenêtre maximisée
- 2. Diminuer la taille de l'application graphique Qt
- 3. Qt Placement de la fenêtre enfant
- 4. QT: Masquer la barre de titre d'une fenêtre/fenêtre
- 5. Obtenir la taille d'un objet Qt
- 6. Obtenir la taille de la fenêtre OpenGL dans Android
- 7. Comment calculer la taille de la zone dans une fenêtre google maps
- 8. Persistance des données WCF entre les sessions
- 9. WPF/XAML - Mise à l'échelle de la taille du texte à la taille de la fenêtre
- 10. Fenêtre Mac HUD dans Qt
- 11. Dérive lors de la restauration de l'emplacement et de la taille de la fenêtre dans WPF
- 12. Comment définir la taille minimale d'une fenêtre principale de xulrunner?
- 13. Meilleure façon de stocker la taille du produit/les garanties dans une base de données?
- 14. Fenêtre Internet Explorer dans Qt?
- 15. Implémentation de la sécurité sur les sessions
- 16. Plusieurs sessions/processus WebBrower dans une fenêtre
- 17. intrication de la parcelle dans Qt gui
- 18. Comment définir la taille de la fenêtre/de l'écran dans xna?
- 19. Sessions NHibernate - quelle est la manière courante de gérer les sessions dans les applications Windows?
- 20. Augmentation de la taille de la police dans la fenêtre de documentation de XCode
- 21. Comment pouvez-vous stocker l'état entre les écrans dans SketchFlow?
- 22. Comment faire pour que l'utilisateur persiste entre les sessions?
- 23. Quelle est la meilleure façon de stocker l'ordre entre les lignes de la base de données?
- 24. Comment faire des options pour la fenêtre popup .. taille e
- 25. Comment stocker une fenêtre de temps récurrente
- 26. Partager des cookies entre les sessions dans IE7
- 27. Comment définir la taille d'une fenêtre d'application Silverlight OOB?
- 28. Comment libérer la mémoire lors de la fermeture d'une fenêtre Qt?
- 29. Comment stocker les liens entre les pages d'un CMS
- 30. Empêcher les utilisateurs de redimensionner la taille de la fenêtre/du formulaire
Si vous souhaitez également enregistrer les positions et le statut de dockwidgets, pas seulement la taille, vous devez utiliser QWidget :: saveState() – mtbkrdave
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. –
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