Как я могу вызвать функцию после того, как функция, которая загружает слои, заканчивает тем, что загружает слои? - PullRequest
0 голосов
/ 19 ноября 2018

Я использую pyqt5 для создания плагина Qgis 3.4, этот плагин должен загружать пару слоев и масштабировать до выбранного, но код выполняется слишком быстро и проходит линию масштабирования до того, как слои загружаются в Qgis.

код следующий:

def openFileNameDialog(self):

    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","All Files (*);;Shapefile's (*.shp)", options=options)
    if fileName:
        shape_name = fileName

    shapelayer = QgsVectorLayer(shape_name, "project's shapefile", "ogr")
    if not shapelayer:
      self.statusBar().showMessage('shapefile is invalid')

    else:


        urlWithParams = 'url=urltoBaseMap'

        rlayer = QgsRasterLayer(urlWithParams, 'BaseMap', 'wms')

        if not rlayer.isValid():
            self.statusBar().showMessage('Layer failed to load!')

        QgsProject.instance().addMapLayer(rlayer)
        QgsProject.instance().addMapLayer(shapelayer)

        self.iface.setActiveLayer(shapelayer)

def layerzoom(self):

    self.iface.zoomToActiveLayer()

def runboth(self):

    self.openFileNameDialog()
    #time.sleep(5)
    self.layerzoom()

как я могу вызвать функцию масштабирования после того, как функция, которая загружает слои, заканчивает загрузку слоев?

Я пробовал time.sleep (), но он не ждет завершения openFileNameFialog (), поэтому проблема сохраняется.

1 Ответ

0 голосов
/ 19 ноября 2018

Добавив эти две строки в код, можно было дождаться увеличения загрузки слоя, благодаря eyllanesc и ekhumoro за наглядность

def stop_signal():  self.layeropen()
self.iface.mapCanvas().renderComplete.connect(stop_signal)

код будет выглядеть так:

def openFileNameDialog(self):

    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","All Files (*);;Shapefile's (*.shp)", options=options)
    if fileName:
        shape_name = fileName

    shapelayer = QgsVectorLayer(shape_name, "project's shapefile", "ogr")
    if not shapelayer:
      self.statusBar().showMessage('shapefile is invalid')

    else:


        urlWithParams = 'url=urltoBaseMap'

        rlayer = QgsRasterLayer(urlWithParams, 'BaseMap', 'wms')

        if not rlayer.isValid():
            self.statusBar().showMessage('Layer failed to load!')
        def stop_signal():  
            self.layeropen()
            self.istft = 'yes'

        QgsProject.instance().addMapLayer(rlayer)
        QgsProject.instance().addMapLayer(shapelayer)

        self.iface.mapCanvas().renderComplete.connect(stop_signal)

def layerzoom(self):
    if self.istft == 'yes':
        self.iface.zoomToActiveLayer()
    if self.istft != 'yes':
        pass

def mainprocess(self):

    self.istft = None
...