11
votes

Qt qmainwindow à proximité

Cela peut sembler une question très simple, mais je souhaite jeter quelques données chaque fois que le qmainwindow ferme, donc j'ai utilisé la pièce de code suivante: xxx

Mais cela ne semble pas l'appeler ferme () . Est-ce que je fais ça mal ?.
N'est-ce pas CentralWidget supposé être détruit?.

ou peut-être que l'application se ferme avant ferme () peut être appelé?. / p>

Toute autre façon de le faire alors?


4 commentaires

ceci est-il installé dans votre Hiérarchie Hiérarchie? Il se peut que cela soit supprimé avant l'envoi du signal. Bien sûr, je ne m'inquiéterais pas trop à ce sujet, car il y a de meilleures alternatives dans les réponses données jusqu'à présent.


Vous ne pouvez pas jeter les données avec le code que vous avez affiché ... De même que votre question est de savoir comment vider les données avant la fermeture de QmainWindow? ou pourquoi qmainwindow ne ferme pas? Faites-le préciser ...


Je veux écrire et fichier XML après que je clique sur le 'X' pour fermer la fenêtre principale. Cela ne semble pas fonctionner avec le code ci-dessus ou la qapplication :: lastwindowcledose () (ou qapplication :: environtoquit () pour la matière) ... Havent a essayé le Qcloseevent, mais de garder la structure MVC, je ne le préfère pas. La classe que je travaille dans Nsnt the QmainWindow, plutôt que j'utilise des fichiers obtenus en compilant des fichiers d'interface utilisateur effectués dans Designer.


Vous pouvez garder MVC en priorisant le cleetvent pour émettre un signal.


7 Réponses :



1
votes

Votre question et votre code initial ne correspondent pas. Si vous voulez faire quelque chose sur le qmainwindow crée une sous-classe et réapprêter CLOSEEEVENT ou connectez-vous à MainWindow :: Détruit () . Voir la 3ème paragraphe pour une note cependant.

Mais votre code montre ce qui semble être une 3ème classe qui connecte un enfant du MainWindow étant détruit à un emplacement appelé Fermer () . CentralWidget sera détruit après que Mainwindow est déjà détruit de sorte que cela ne vous aide probablement pas de toute façon.

En outre, cela dépend de la manière dont vous avez créé MAINWINDOW (pile ou tas) et si vous le détruisez correctement. Idéalement, vous devez créer une sous-classe de qmainwindow (que si vous avez utilisé le concepteur, vous avez probablement déjà déjà).


0 commentaires

29
votes

Vous feriez mieux de réaliser une fonction virtuelle dans votre catégorie principale code> MAINWINDOW CODE> CLASS:

void MainWindow::closeEvent(QCloseEvent *event) {
     // do some data saves or something else
}


2 commentaires

C'est une bonne idée de compléter le remplacement. C.-à-don: dans le classement () appeler Qmainwindow :: Closteevent (événement); à la fin de la fonction. Voir l'exemple de la documentation de la fonction Savestate () ici: Doc.qt.io/ qt-4.8 / qmainwindow.html


Tandis que ph0t0n n'est pas nécessairement faux, le monde réel closeeEvent () Les implémentations appellent généralement event.accept () ou event.ignore () Selon si des changements non sautés existent ou non. QmainWindow :: ClosteEvent (Event) est typiquement pas appelé. Voir ClatEeEvent () Documentation pour encore un autre exemple utile.



10
votes

J'essayerais qguapplication :: LastWindowcledose () à la place .


4 commentaires

N'a pas fonctionné, il faut vouloir dire qu'il est détruit avant que ce signal puisse être accepté? Mais c'est étrange parce que le destructeur de la classe ne semble pas susciter quoi que ce soit (via STD :: Cerr)


Assurez-vous que l'objet avec le logement n'est pas un enfant du QmainWindow. Qwidgets détruisent tous leurs enfants quand ils descendent.


@Cenoc: Postez votre fonction principale , cela peut aider à effacer ce qui se passe.


Woops, bonne prise, ça a fonctionné! Un million de merci! Certainement n'aurait pas regardé dans la Qapplication pour cela.



-2
votes

Que diriez-vous d'ajouter le code de vidage à votre destructeur de fenêtres principaux?


1 commentaires

Vous ne pouvez pas accéder aux I / O dans les détruits ou le destructeur du MainWindow - vous êtes enfin dans votre destructeur d'applications et tout est détruit. Utilisez le closEevent () à la place.



1
votes

Mettre en œuvre QmainWindow :: ClosteEvent (Qcloseevent *) dans votre classe. Ensuite, implémentez un nouveau signal appelé fermeture () et émettez-le à partir de votre implémentation de qmainwindow :: Closteevent () . Ensuite, vous pouvez vous connecter à ce signal pour faire quelque chose juste avant la fermeture de la fenêtre. Vous pouvez également utiliser cleetEeVentant directement pour faire ce que vous devez faire, comme sauvegarder l'état, les données de synchronisation ou quoi que ce soit.


0 commentaires

2
votes

 Entrez la description de l'image ici Dans Python (Pyqt4 ou Pyqt5), vous devez procéder comme suit:

<myProj.MyWindow object at 0x000001D3C3B3AAF8>
True

<myProj.MyWindow object at 0x000001D3C3B3AAF8>
False


0 commentaires