Snížení redundantní kód pro PyQt aplikace

0

Otázka

Ještě nejsem výřečný dost na to, být konkrétní s mým název, ale to je v podstatě problém. Dělám QGISU plugin s PyQt.

SKRIPT

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)

Pokud plugin je otevřel poprvé, nebude mít potřebné widgety naplněné, protože cmbLyrSelect pouze widget emituje signál, když uživatel změní vrstvu.

První otevřený

enter image description here

Pokud je vrstva změněna

enter image description here

ŘEŠENÍ - duplicitní kód v getLayerInfo metoda __init__ metoda tak, že widgety jsou vyplněny jednou plugin spustí.

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)
class methods pyqt python
2021-11-20 10:44:42
1

Nejlepší odpověď

1

Jen volat getLayerInfo jednou výslovně v __init__ před registrací LayerChanged zpětné volání:

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)  
2021-11-20 11:20:59

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................