Сокращение избыточного кода для приложения PyQt

#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)