Je suis actuellement en train de développer un plugin pour QGIS avec Python 2.7 et PyQt 4. Mon plugin devrait avoir une liste vérifiable de couches de cartes (liste d'éléments non pertinentes) qui serait régénérée chaque fois que l'utilisateur ouvre l'onglet Paramètres . Bien que j'ai réussi à créer une liste vérifiable de QCheckBoxes qui régénère chaque fois que je clique sur le bouton Paramètres, il est encore loin d'être bon et fonctionnel. Comme je l'ai compris, mon problème est principalement la relation parent-enfant et la suppression de la mise en page.Liste QCheckBox dynamiquement modifiable
self.layers = qgis_api.get_layers()
#ScrollArea setup
if (api.selected_upload_layers == [] and
api.project.layerTreeRoot().children() != []):
self.tmp_layers = qgis_api.get_layers()
self.layout = QVBoxLayout(self.settingsDock.groupBox)
self.scroll = QScrollArea()
self.layout.addWidget(self.scroll)
self.scroll.setWidgetResizable(True)
self.scroll.setFixedHeight(111)
self.scrollContent = QWidget(self.scroll)
self.scrollLayout = QVBoxLayout(self.scrollContent)
self.scrollContent.setLayout(self.scrollLayout)
self.scroll.setWidget(self.scrollContent)
i = 0
self.checkboxes = []
for layer in self.layers:
self.checkboxes.append(QCheckBox("{0}".format(layer.name())))
self.checkboxes[i].stateChanged.connect(lambda checked, i = i : self.cBoxChecked(self.checkboxes[i])) #inverts logic if run every time
# check logic
if i < len(self.layers)-1:
i += 1
# Create checkboxes first time
if not api.upload: #api.upload becomes true when clicked save in settings
for i in range(0, len(self.layers)):
try:
self.scrollLayout.addWidget(self.checkboxes[i])
self.checkboxes[i].setChecked(True)
except Exception as e:
print str(e)
# compare layer list at creation and now to notice difference
elif self.tmp_layers != self.layers:
for i in range(0, self.scrollLayout.count()):
self.scrollLayout.removeItem(self.scrollLayout.itemAt(0))
try: # delete old layer items
for i in range(0, len(self.layers)):
self.scrollLayout.addWidget(self.checkboxes[i])
self.checkboxes[i].setChecked(True)
except Exception as e:
print str(e)
Fonction cBoxChecked() est la suivante:
def cBoxChecked(self, cBox):
""" Add functionality to ScrollArea checkboxes."""
if cBox.isChecked():
if cBox.text() not in api.selected_upload_layers:
api.selected_upload_layers.append(cBox.text())
else:
try:
api.selected_upload_layers.remove(cBox.text())
except Exception as e:
print str(e)
alhtough maintenant je ne reçois aucune exception, et la liste est régénérés. Je remarque l'ancienne liste sous la nouvelle, ce qui signifie que je ne supprime pas la mise en page correctement (il y a plusieurs questions pour la suppression de la mise en page) mais je ne pouvais pas la comprendre complètement. Résumer. Quel est le moyen le plus commode de détruire et de recréer la mise en page et de comprendre les relations QObject parent-enfant dans cet exemple concret? Et une autre question qui me dérange est que, à chaque nouvelle ouverture de l'onglet des paramètres, il semble y avoir une réverbération logique dans la fonction lambda qui fait tout le poids pour sélectionner certains CheckBox. Comment réparer ça? Merci pour votre temps :)