美文网首页
结合源码分析QgsMapLayerFactory::create

结合源码分析QgsMapLayerFactory::create

作者: NullUser | 来源:发表于2022-06-16 11:42 被阅读0次

    1.调用

    1) QgsMapLayerFactory::createLayer

    在QgsMapLayerFactory::createLayer()内判断需创建的图层类型后创建对应的图层对象实例

    QgsMapLayerFactory::createLayer(...)
    └─new QgsVectorLayer(...)
    

    2) QgsVectorLayer构造函数

    当传入的图层路径和providerKey都不为空时,调用父类QgsMapLayer::setDataSource设置数据源

    QgsMapLayerFactory::createLayer(...)
    └─new QgsVectorLayer(...)
        └─QgsMapLayer::setDataSource(...)
    

    3) QgsMapLayer::setDataSource()

    QgsMapLayer::setDataSource内部调用了setDataSourcePrivate(),由于setDataSourcePrivate是虚函数且子类QgsVectorLayer对其进行了实现,所有此时的函数实现为QgsVectorLayer::setDataSourcePrivate()

    QgsMapLayerFactory::createLayer(...)
    └─new QgsVectorLayer(...)
        └─QgsMapLayer::setDataSource(...)
            └─QgsVectorLayer::setDataSourcePrivate(...)
    

    4) QgsVectorLayer::setDataSourcePrivate

    setDataSourcePrivate内调用setDataProvider()设置图层的dataprovider

    QgsMapLayerFactory::createLayer(...)
    └─new QgsVectorLayer(...)
        └─QgsMapLayer::setDataSource(...)
            └─QgsVectorLayer::setDataSourcePrivate(...)
                  └─setDataProvider(...)
    

    2. QgsVectorLayer::setDataProvider()

    1) 创建DataProvider对象

    通过QgsProviderRegistry::createProvider创建对应的Provider对象

    bool QgsVectorLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
    {
      ......
      mDataProvider = qobject_cast<QgsVectorDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, mDataSource, options, flags ) );
      ......
    }
    

    2) 如果可以获取图层元数据

    bool QgsVectorLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
    {
      ......
      mDataProvider = qobject_cast<QgsVectorDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, mDataSource, options, flags ) );
      ......
      if ( mDataProvider->capabilities() & QgsVectorDataProvider::ReadLayerMetadata )
      {
        // we combine the provider metadata with the layer's existing metadata, so as not to reset any user customizations to the metadata
        // back to the default if a layer's data source is changed
        QgsLayerMetadata newMetadata = mDataProvider->layerMetadata();
        // this overwrites the provider metadata with any properties which are non-empty from the existing layer metadata
        newMetadata.combine( &mMetadata );
    
        setMetadata( newMetadata );
        QgsDebugMsgLevel( QStringLiteral( "Set Data provider QgsLayerMetadata identifier[%1]" ).arg( metadata().identifier() ), 4 );
      }
      ......
    }
    

    相关文章

      网友评论

          本文标题:结合源码分析QgsMapLayerFactory::create

          本文链接:https://www.haomeiwen.com/subject/pntqvrtx.html