La bonne façon de faire le ménage des widgets dans pyqt
Quelle est la "bonne" ou idiomatiques façon de nettoyage/supprimer des widgets lors de l'utilisation de PyQt4?
Considérons le code suivant:
choices = ['a', 'b', 'c']
checkboxes = []
layout = QtGui.QVBoxLayout()
dialog = MyDialog()
for c in choices:
checkboxes.append(QtGui.QCheckBox(c)
layout.addWidget(chkbox)
dialog.setLayout(layout)
for c in checkboxes:
c.setParent(None)
c.deleteLater()
c = None
Le code ci-dessus utilise setParent()
, deleteLater()
, et de définir l'objet de None
. Sont tous de ces nécessaires?
Un autre scénario possible est que j'ai une boîte de dialogue avec un tas de widgets sur elle et que vous souhaitez supprimer ces widgets et d'en ajouter de nouvelles. Je ne veux pas de "fuite" à l'ancienne widgets, mais je ne suis pas sûr de ce que la bonne façon de faire quelque chose comme ce serait.
Il me semble que deleteLater()
ne pourrait être nécessaire. C'est juste qu'il décrémenter le compteur de référence? Si oui, ne serait pas juste définition de la variable à Aucun faire la même chose?
Vous devez vous connecter pour publier un commentaire.
Première chose que vous devriez vous rappeler de le faire est d'utiliser les relations parent/enfant pour vos widgets. Lorsque vous faites cela, ils seront la propriété de l'intervalle Qt et nettoyer automatiquement tous les enfants lorsque le parent est supprimé.
Dans cette situation, toutes les cases d'être convenablement nettoyés lorsque vous supprimez la boîte de dialogue. Ce ne gère qu'une partie de votre question. Je me rends compte que vous êtes implicitement avoir le parent définir lorsque vous les ajoutez à la mise en page. Mais vous ne devriez pas alors clair que parent, avant de le supprimer. Il est de la relation de parenté qui permet à l'enfant d'être supprimés automatiquement. Pas un compte de référence. La référence de l'aspect serait un python côté de la chose, où elle permettra d'obtenir des ordures collectées lorsqu'il n'y a plus de références.
deleteLater
est très important, pour les utiliser quand vous voulez que la suppression se produire lorsque le contrôle revient à la eventloop. C'est aussi le moyen sûr de supprimer les widgets lorsque vous êtes en train de supprimer certains à partir d'un modèle et d'en ajouter de nouveaux:Ces widgets seront effectivement supprimés une fois que cette méthode est terminée.
deleteLater
est également utile pour supprimer le widget en vertu de laquelle la fente ou d'un événement qui se produit actuellement. Comme un QPushButton qui peut supprimer lui-même sur cliquez sur.Il n'y a pas besoin de beaucoup pour définir
c = None
. Une fois qu'un parent est supprimé, et qui déclenche la suppression de tous ses enfants, de manière récursive, votre python les références à cet objet ne sera pas valide. Donc, tout ce que vous devez faire est de simplement ne les utilisez plus. Si ils sont dans une liste, effacer la liste. L'accès soulève laRuntimeError: wrapped C/C++ object of %S has been deleted
ce qui signifie qu'ils sont supprimés.parent
argument lors de la création de tous les objets qui seront ajoutés à une mise en page? Je me rends compte, c'est probablement un peu plus explicite, mais est-il nécessaire?parent
argument — c'est probablement une bonne idée, car elle restreint la structure de votre code un peu, et le rend plus facile pour les autres de voir ce que la destinée de confinement de la hiérarchie.RuntimeError: wrapped C/C++ object
erreur" - comment puis-je vérifier si un objet n'est pas valide ou n'a été supprimé? J'ai besoin d'un moyen de vérifier sic
a été supprimé, mais je ne sais pas comment. Voir ma question: stackoverflow.com/questions/27420338/...