現在、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を選択する際に重労働が起こっているようです。それを修正するには? ありがとうございました:)