0

我正在尝试使用新线程中的计时器更新 QgsProject 实例的层,并在 QMainWindow 中显示更新的数据。但是,无论我更改属性/功能/图层,它总是冻结应用程序。我知道 QgisProject 存在于主线程中,所以甚至可以在不冻结应用程序的情况下更改图层吗?如果是怎么办?

下面的代码是我试图在一个额外的线程中做的事情。

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:
            # get item from dataframe
            value = newDf[newDf[keyCol] == str(feat.attributes()[keyColIdx])][colToEdit].item()
            # change attribute
            layer.changeAttributeValue(feat.id(), colToEditIdx, value)
         except:
            pass
canvas.refresh()
4

1 回答 1

0

事实证明,当您使用 dataProvider 的 changeAttributeValues 方法时,它不会冻结,尽管它的语法略有不同。

于 2021-12-14T16:51:28.947 回答