es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La actualización de capas de canvas en PyQgis congela la aplicación

Estoy tratando de actualizar una capa de una instancia de QgsProject con un temporizador en un nuevo hilo y mostrar los datos actualizados en una QMainWindow. Pero sin importar cómo cambie los atributos/características/capas, siempre se congela la aplicación. Entiendo que el QgisProject vive en el hilo principal, ¿así que es posible cambiar una capa sin congelar la aplicación? ¿Si es así, cómo?

El código a continuación es lo que estoy intentando hacer en un hilo adicional.

self.project = QgsProject.instance()
layer = self.project.mapLayersByName(layerName)[0]

keyColIdx = layer.fields().indexOf(keyCol)

with edit(layer):
   for feat in layer.getFeatures():
      for colToEdit in colsToEdit:
         colToEditIdx = layer.fields().indexOf(colToEdit)
         try:
            # Obtener elemento del dataframe
            value = newDf[newDf[keyCol] == str(feat.attributes()[keyColIdx])][colToEdit].item()
            # Cambiar atributo
            layer.changeAttributeValue(feat.id(), colToEditIdx, value)
         except:
            pass
canvas.refresh()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Generalmente no se recomienda actualizar una instancia de QgisProject desde un hilo separado, ya que esto puede generar conflictos e inestabilidad. Sin embargo, existen algunas formas de actualizar una capa sin congelar la aplicación.

    Un enfoque es utilizar señales y ranuras para comunicarse entre el hilo principal y el hilo de trabajo. Por ejemplo, se podría emitir una señal desde el hilo de trabajo que contenga los datos actualizados de la capa, y conectarla a una ranura en el hilo principal que actualice la capa en la interfaz de usuario.

    Otro enfoque es utilizar las herramientas de edición incorporadas en QGIS para actualizar los datos de la capa. Esto se puede hacer utilizando los métodos featureChanged() y changeAttributeValue() de la clase QgsVectorLayer. Esto permite editar los datos de la capa sin necesidad de acceder a la instancia del proyecto o actualizar el lienzo.

    Finalmente, también se podría considerar el uso de QgsApplication.processEvents() en el hilo de trabajo para permitir que el hilo principal responda a la entrada del usuario mientras se realiza la actualización. Sin embargo, este enfoque debe utilizarse con precaución, ya que puede generar un comportamiento inesperado y debe ser probado exhaustivamente antes de su implementación.

Comments are closed.