ajouter et supprimer dynamiquement des widgets dans PyQt
à l'aide de PyQt, je suis en train de créer une interface pour laquelle je peux ajouter ou supprimer un widget de façon dynamique. Je veux définir une catégorie distincte pour le widget qui va être ajouté ou supprimé. Je ne peux pas semblent être en mesure d'obtenir le widget que j'instancie pour afficher à l'intérieur de l'interface principale. Ici c'est le code que j'utilise:
from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)
# central widget
self.centralWidget = QtGui.QWidget(self)
# main layout
self.vLayout = QtGui.QVBoxLayout(self.centralWidget)
# main button
self.pButton_add = QtGui.QPushButton(self.centralWidget)
self.pButton_add.setText('button to add other widgets')
# scroll area
self.scrollArea = QtGui.QScrollArea(self.centralWidget)
self.scrollArea.setWidgetResizable(True)
# scroll area widget contents
self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)
# scroll area widget contents - layout
self.formLayout = QtGui.QFormLayout(self.scrollAreaWidgetContents)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
# add all main to the main vLayout
self.vLayout.addWidget(self.pButton_add)
self.vLayout.addWidget(self.scrollArea)
# set central widget
self.setCentralWidget(self.centralWidget)
# connections
self.pButton_add.clicked.connect(self.addWidget)
def addWidget(self):
z = Test(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount()
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
class Test(QtGui.QWidget):
def __init__( self, parent):
super(Test, self).__init__(parent)
self.pushButton = QtGui.QPushButton(self)
app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()
le truc, c'est que lorsque j'utilise le code ci-dessous à l'intérieur de mon "addWidget " méthode", il fait exactement ce que je veux faire, mais la méthode de classe ne semble pas fonctionner.
z = QtGui.QPushButton(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount())
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
Je me demande pourquoi le z = Test() n'est pas en produisant des résultats? Des idées? Merci!
source d'informationauteur boundless
Vous devez vous connecter pour publier un commentaire.
En fait, il ne fonctionne pas. Le problème, c'est que votre
Test
widget a unQPushButton
sans aucune mise en page de gestion. Donc il ne peut pas calculer saminimumSize
à la prise de la touche en considération. Lorsque vous mettez à ce widget dans une mise en page, c'est juste se rétrécit à0
(depuis unQWidget
n'a pas de défautminimumSize
) et vous ne voyez rien.Vous avez deux choix, soit vous gérer manuellement la mise en page et entrez dans un monde inutile de douleur, ou de vous compter sur des gestionnaires de disposition. En général, vous devriez préférer ce dernier.
Je re-écrire votre script comme ceci (Bien que je ne suis pas sûr de savoir pourquoi vous utilisez
QFormLayout
je laisse comme c'est.):Ici est un petit changement qui fera le bouton supprimer lui-même après avoir cliqué sur:
De cette façon, il ne devrait pas mem fuite quand il est supprimé et le bouton peut être utilisé pour des trucs. J'ai suivi ce modèle pour les barres de progression par dizaines pour les téléchargements et des morceaux de surveillance et il fonctionne très bien même avec le filetage et le multi traitement. Et pas facile QThreads...
Si u veux dire , supprimer un widget à chaque fois qu'un bouton est cliqué , ou lors de tout événement de programme ur , utilisez le deleteLater() méthode :
self.yourwidget.deleteLater()
auto.widget de.deleteLater();
À l'aide de la fonction ci-dessus fait à ce widget pour disparaître à partir de l'Application