#python #class #methods #pyqt #signals-slots
Вопрос:
Я еще недостаточно четко сформулировал свое название, чтобы конкретизировать его, но в этом, в основном, и проблема. Я создаю плагин QGIS с PyQt.
скрипт
class CreateSomething(QtWidgets.QDialog, FORM_CLASS): def __init__(self, parent=None): """Constructor.""" super(CreateSomething, self).__init__(parent) self.setupUi(self) # Only select polygon layers in the layer combo box self.cmbLyrSelect.setFilters(QgsMapLayerProxyModel.PolygonLayer) # Emits a signal and connects to a function when layer is changed self.cmbLyrSelect.layerChanged.connect(self.getLayerInfo) # Function to get layer info if layer changed def getLayerInfo(self): # Selected/current layer in the combo box currLyr = self.cmbLyrSelect.currentLayer() # Gets layer centroid lyrLoc = self.cmbLyrSelect.currentLayer().sourceExtent().center().toString(3) # Writes layer centroid to line edit self.linLyrLoc.setText(str(lyrLoc)) # Populates combo box with fields of current layer self.cmbLyrFields.setLayer(currLyr)
Если плагин открыт в первый раз, в нем не будут заполнены необходимые виджеты, потому cmbLyrSelect
что виджет выдает сигнал только тогда, когда пользователь меняет слой.
Первый открытый
Если слой изменен
ОБХОДНОЙ ПУТЬ — дублируйте код в getLayerInfo
методе в __init__
метод, чтобы виджеты заполнялись после запуска плагина.
class CreateSomething(QtWidgets.QDialog, FORM_CLASS): def __init__(self, parent=None): """Constructor.""" super(CreateSomething, self).__init__(parent) self.setupUi(self) self.cmbLyrSelect.setFilters(QgsMapLayerProxyModel.PolygonLayer) self.cmbLyrSelect.layerChanged.connect(self.getLayerInfo) currLyr = self.cmbLyrSelect.currentLayer() lyrLoc = self.cmbLyrSelect.currentLayer().sourceExtent().center().toString(3) self.linLyrLoc.setText(str(lyrLoc)) self.cmbLyrFields.setLayer(currLyr)
Ответ №1:
Просто позвоните getLayerInfo
один раз явно, __init__
прежде чем регистрировать обратный вызов LayerChanged:
def __init__(self, parent=None): """Constructor.""" super(CreateSomething, self).__init__(parent) self.setupUi(self) # Only select polygon layers in the layer combo box self.cmbLyrSelect.setFilters(QgsMapLayerProxyModel.PolygonLayer) # Explicitly get layer info on init self.getLayerInfo() # Emits a signal and connects to a function when layer is changed self.cmbLyrSelect.layerChanged.connect(self.getLayerInfo)