저는 현재 Python 2.7 및 PyQt 4로 QGIS 용 플러그인을 개발 중입니다. 플러그인에서 사용자가 설정 탭을 열 때마다 재생성 될 맵 레이어 목록 (항목 목록 일 수 있음)이 있어야합니다. . 설정 버튼을 클릭 할 때마다 재생성되는 QCheckBoxes의 확인 가능한 목록을 만들 수 있었지만 여전히 훌륭하고 기능적인 것은 아닙니다. 내가 알아 낸대로, 내 문제는 주로 부모 - 자식 관계와 레이아웃 삭제입니다.동적으로 변경 가능한 QCheckBox 목록
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 내가 예외를하지 않으며, 목록이 재생됩니다 다음과 같이
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)
기능 cBoxChecked는()입니다. 새 레이아웃 아래에 오래된 목록이 있다는 것을 알았습니다. 즉, 레이아웃을 올바르게 삭제하지 않고 있습니다 (레이아웃 삭제에 대한 다양한 질문이 있음). 그러나 완전히 이해할 수는 없습니다. 그것을 요 약하기. 이 구체적인 예에서 레이아웃을 파괴하고 재창조하는 가장 편리한 방법과 부모 - 자식 QObject 관계를 파악하는 방법은 무엇입니까? 그리고 저를 귀찮게하는 또 하나의 질문은 새로운 설정 탭이 열릴 때마다 특정 CheckBox를 선택하는 데 많은 어려움을 겪게되는 람다 함수에서의 논리 전환이있는 것 같습니다. 그것을 고치는 방법? 시간 내 주셔서 감사합니다.