Daugiau

Problema išskleidžiamajame lange („QComboBox“) „QGIS 2.6 Python“ papildinyje


Aš sukūriau papildinį, kuris skaičiuoja Qgis2.6 sluoksnio funkcijų skaičių. Kai pirmą kartą įkeliu sluoksnį, pasakykite „Oro uostas“ ir spustelėkite papildinio išskleidžiamąjį langelį, jame vieną kartą nurodomas oro uostas. Problema ta, kad jei uždarysiu papildinį ir dar kartą, jei naudosiu papildinį ir išplėsiu -žemyn langelį matau, kad sluoksnis „Oro uostas“ yra išvardytas du kartus. Atsiprašau, kad negalėjau užfiksuoti iššokančio langelio. Manau, tai gali būti dėl tam tikrų atminties problemų. Bet išsiaiškinti tikslią problemą gali man labai padėti. Pridėjau bendrą savo įskiepio išvaizdą. Ar yra koks nors būdas išvalyti elementus iš kombinuoto laukelio? Tikiuosi, kad tai padeda.

iš qgis.core importuoti QgsMapLayerRegistry, QgsMapLayer iš PyQt4.QtCore importuoti QSettings, QTranslator, qVersion, QCoreApplication iš PyQt4.QtGui importuoti QAction, QIcon, QMessageBox # Inicijuoti Qt išteklius iš failų išteklių iš importuojamo dialogo importuoti FeatureCountDialog importuoti os.path klasę FeatureCount: "" "QGIS papildinio diegimas." "" def __init __ (self, iface): "" "Konstruktorius.: param iface: sąsajos egzempliorius, kuris bus perduotas šiai klasei kuriuo galite paleisti darbo laiką su QGIS programa.: type iface: QgsInterface "" " # Išsaugoti nuorodą į QGIS sąsają self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname (__ file__) # initialize locale locale = QSettings (). value ('locale/userLocale') [0: 2] locale_path = os.path.join (self.plugin_dir, 'i18n', 'FeatureCount _ {}. qm'.format (locale)), jei os.path.exists (locale_path): self.translator = QTranslator () self.tr anslator.load (locale_path) if qVersion ()> '4.3.3': QCoreApplication.installTranslator (self.translator) # Sukurkite dialogą (po vertimo) ir išsaugokite nuorodą self.dlg = FeatureCountDialog () # Deklaruoti egzemplioriaus atributus self.actions = [] self.menu = self.tr (u '& FeatureCount') # TODO: Mes leisime vartotojui tai nustatyti būsimoje iteracijoje self.toolbar = self.iface.addToolBar (u'FeatureCount '). toolbar.setObjectName (u'FeatureCount ') # noinspection PyMethodMayBeStatic def tr (self, message): "" "Gaukite eilutės vertimą naudodami Qt vertimo API. Mes tai įgyvendiname patys, nes nepaveldime QObject. : param message: eilutė vertimui. : tipo pranešimas: str, QString: grąžina: išversta pranešimo versija. : rtype: QString "" " # noinspection PyTypeChecker, PyArgumentList, PyCallByClass return QCoreApplication.translate ('FeatureCount', message) def add_action (self, icon_path, text, callback, enabled_flag = True, add_to_menu = status, add Nėra, whats_this = Nėra, tėvas = Nėra): "" "Pridėti įrankių juostos piktogramą prie įrankių juostos. : param icon_path: Kelias į šio veiksmo piktogramą. Gali būti išteklių kelias (pvz., ': /Plugins/foo/bar.png ">


Galite išvalyti a„QComboBox“skambindamas savoaišku ()metodas.

Jūsų atveju būtų prasminga redaguotibėgti ()metodą, kad kiekvieną kartą vartotojui paleidus papildinį (pvz., spustelėjus pagrindinį papildinio mygtuką),„QComboBox“pašalinamas prieš pridedant sluoksnių:

def run (self): "" "Vykdymo metodas, atliekantis visą tikrąjį darbą" "" # rodo dialogo langą self.dlg.show () # Išvalykite QComboBox prieš įkeliant sluoksnius self.dlg.featurecombo.clear () layer = QgsMapLayerRegistry .instance (). mapLayers (). reikšmės () sluoksniui sluoksniuose: if layer.type () == QgsMapLayer.VectorLayer: self.dlg.featurecombo.addItem (layer.name (), layer)

Pabandykite perkelti žemiau esančią kodo dalį iš bėgti į initGui funkcija.

sluoksniai = QgsMapLayerRegistry.instance (). mapLayers (). reikšmės () sluoksniui sluoksniuose: if layer.type () == QgsMapLayer.VectorLayer: self.dlg.featurecombo.addItem (layer.name (), layer)