Cela peut sembler une question très simple, mais je souhaite jeter quelques données chaque fois que le Mais cela ne semble pas l'appeler ou peut-être que l'application se ferme avant Toute autre façon de le faire alors? p> p> qmainwindow code> ferme, donc j'ai utilisé la pièce de code suivante: ferme () code>. Est-ce que je fais ça mal ?.
N'est-ce pas CentralWidget supposé être détruit?. P> ferme () code> peut être appelé?. / p>
7 Réponses :
Pourriez-vous implémenter le CLOSEEEVENT CODE> A > Fonction pour votre qmainwindow code> et mettez votre code là-bas? P>
Votre question et votre code initial ne correspondent pas. Si vous voulez faire quelque chose sur le Mais votre code montre ce qui semble être une 3ème classe qui connecte un enfant du 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 code> crée une sous-classe et réapprêter CLOSEEEVENT code> ou connectez-vous à MainWindow :: Détruit () Code>. Voir la 3ème paragraphe pour une note cependant. P>
MainWindow code> étant détruit à un emplacement appelé Fermer () code>. CentralWidget CODE> 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. p>
qmainwindow code> (que si vous avez utilisé le concepteur, vous avez probablement déjà déjà). P>
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
}
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 event.accept () code> ou event.ignore () code> Selon si des changements non sautés existent ou non. QmainWindow :: ClosteEvent (Event) Code> est typiquement pas i> appelé. Voir ClatEeEvent () Code> Documentation pour encore un autre exemple utile.
J'essayerais qguapplication :: LastWindowcledose () à la place . p>
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 code>, 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.
Que diriez-vous d'ajouter le code de vidage à votre destructeur de fenêtres principaux? p>
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.
Mettre en œuvre QmainWindow :: ClosteEvent (Qcloseevent *) code> dans votre classe. Ensuite, implémentez un nouveau signal appelé fermeture () code> et émettez-le à partir de votre implémentation de qmainwindow :: Closteevent () code>. Ensuite, vous pouvez vous connecter à ce signal pour faire quelque chose juste avant la fermeture de la fenêtre. Vous pouvez également utiliser cleetEeVentant code> directement pour faire ce que vous devez faire, comme sauvegarder l'état, les données de synchronisation ou quoi que ce soit. P>
Où
ceci code> est-il installé dans votreHiérarchie code> 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.