2017-05-16 4 views
2

J'ai un numéro de QDockWidgets, tous ancrés dans un seul QMainWindow.QDockWidget :: restoreGeometry ne fonctionne pas correctement lorsque QMainWindow est agrandie

J'ai surchargé l'showEvent, et après avoir passé l'événement à la classe de base que je restaure la géométrie du widget dock

void DockWidget::showEvent(QShowEvent* ev) 
{ 
    QDockWidget::showEvent(ev); 

    QByteArray byte_array = settings_.value(id + ".geometry").toByteArray(); 

    LOG("rest: %s", QString(byte_array.toHex())); 

    QDockWidget::restoreGeometry(byte_array); 
} 

Dans mon QMainWindow::closeEvent je fais appel saveSettings pour chacun de mes widgets quai

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    QList<DockWidget*> dock_widgets = findChildren<DockWidget*>(); 

    for (DockWidget* dock_widget : dock_widgets) 
     dock_widget->saveSettings(); 

    QMainWindow::closeEvent(ev); 
} 

Dans mon widget dock » s fonction saveSettings j'écrire le résultat de saveGeometry sur le disque:

void DockWidget::saveSettings() 
{ 
    QByteArray byte_array = QDockWidget::saveGeometry(); 

    LOG("save: %s", QString(byte_array.toHex())); 

    settings_.setValue(id + ".geometry", byte_array); 
    settings_.sync(); 
} 

Bien que cela ne fonctionne quand mon QMainWindow n'est pas maximisé, quand il est maximisé les widgets ne sont pas restaurés correctement.

In this image J'ai arrangé mes widgets juste avant la fermeture. (lié car l'image en ligne sera trop grande)

Dans this image Je recharge mon application et la géométrie des widgets est mal chargée.

Vous pouvez voir dans mes fonctions ci-dessus que j'enregistre la chaîne de géométrie en cours d'enregistrement et de chargement.

J'ai prouvé à moi-même que les paramètres sont correctement sauvegardés et restaurés à nouveau, mais en quelque sorte il ne fonctionne pas correctement

fermer l'application; enregistrer l'état:

save: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780 

ouvrir l'application; restaurer l'état: (les données hexagonaux ici correspond sauvé un exactement)

rest: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780 

fermer l'application à nouveau, ayant rien touché: (les données hexagonale est différent maintenant, la géométrie est différente, voir les marques ci-dessous)

save: 01d9d0cb000200000000053f000000640000077f0000014e0000053f000000640000077f0000014e00000000000000000780 
                ^       ^

Cela ne se produit pas lorsque la fenêtre n'est pas agrandie.

Est-ce un bug dans Qt, ou est-ce que je n'utilise pas la fonctionnalité correctement? Je utilise Qt 5.5 sur Ubuntu 16.04.

Répondre

1

Ceci est un bug dans Qt. Plus précisément, QTBUG-46620 et éventuellement aussi QTBUG-16252.

Le rapport de bogue de QTBUG-46620 détaille une solution de rechange que vous devriez essayer.Pour commencer, assurez-vous que la principale géométrie de la fenêtre et de l'état de la fenêtre principale sont enregistrées lorsque vous fermez l'application (notez que vous ne devriez pas avoir à enregistrer la géométrie de chaque fenêtre dock séparément):

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    settings_.setValue("geometry", saveGeometry()); 
    settings_.setValue("state", saveState()); 
} 

Ensuite, restaurer la géométrie comme suit:

restoreGeometry(settings.value("geometry").toByteArray()); 
if (isMaximized()) 
{ 
    setGeometry(QApplication::desktop()->availableGeometry(this)); 
} 
restoreState(settings.value("windowState").toByteArray()); 

Si vous avez des problèmes avec ce qui précède le travail autour, vous pouvez également enregistrer l'état maximisé de la fenêtre:

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    settings_.setValue("geometry", saveGeometry()); 
    settings_.setValue("state", saveState()); 
    settings_.setValue("maximized", isMaximized()); 
} 

Ensuite, restaurez comme suit:

restoreGeometry(settings.value("geometry").toByteArray()); 
if (settings.value("maximized").toBool()) 
{ 
    showMaximized(); 
    setGeometry(QApplication::desktop()->availableGeometry(this)); 
} 
restoreState(settings.value("windowState").toByteArray()); 

Notez que ces solutions peuvent entraîner la génération de messages d'avertissement sur certaines plates-formes.

+0

Merci, la première suggestion a parfaitement fonctionné! En fait, le seul changement requis était d'utiliser 'geometry' et' setGeometry' au lieu de 'saveGeometry' /' restoreGeometry' –