1. addVectorLayer接口调用
1). QgisInterface提供接口addVectorLayer用以添加矢量图层,该接口由QgisAppInterface实现
QgisInterface::addVectorLayer()
↓ 实现
QgisAppInterface::addVectorLayer()
2).QgisAppInterface::addVectorLayer()内调用QgisApp::addVectorLayer()
QgisInterface::addVectorLayer(...)
↓ 实现
QgisAppInterface::addVectorLayer(...)
└─qgis->addVectorLayer(...)
3).调用QgisApp的私有函数addLayerPrivate(...),该函数接收图层类型,用以创建不同类型的图层,如:QgsVectorLayer、QgsMeshLayer、QgsRasterLayer
QgisInterface::addVectorLayer(...)
↓ 实现
QgisAppInterface::addVectorLayer(...)
└─qgis->addVectorLayer(...)
└─addLayerPrivate(...)
2.QgisApp::addLayerPrivate()
1).addLayerPrivate通过QgsProviderRegistry解析uri
template<typename T>
T *QgisApp::addLayerPrivate( QgsMapLayerType type, const QString &uri, const QString &name, const QString &providerKey, bool guiWarnings )
{
......
QVariantMap uriElements = QgsProviderRegistry::instance()->decodeUri( providerKey, uri );
......
}
在QgsProviderRegistry::decodeUri(...)内部通过providerKey找到QgsProviderMetadata对象指针,再通过该指针调用QgsProviderMetadata::decodeUri()
QVariantMap QgsProviderRegistry::decodeUri( const QString &providerKey, const QString &uri )
{
QgsProviderMetadata *meta = findMetadata_( mProviders, providerKey );
if ( meta )
return meta->decodeUri( uri );
else
return QVariantMap();
}
2).往下判断是否可以查询子图层(?)
const bool canQuerySublayers = QgsProviderRegistry::instance()->providerMetadata( providerKey ) &&
( QgsProviderRegistry::instance()->providerMetadata( providerKey )->capabilities() & QgsProviderMetadata::QuerySublayers );
T *result = nullptr;
if ( canQuerySublayers )
{......}
else
{......}
3).不可以查询子图层时,通过QgsMapLayerFactory::createLayer构造图层对象,QgsMapLayerFactory::createLayer见createLayer源码分析
......
if ( canQuerySublayers )
{......}
else
{
QgsMapLayerFactory::LayerOptions options( QgsProject::instance()->transformContext() );
options.loadDefaultStyle = false;
result = qobject_cast< T * >( QgsMapLayerFactory::createLayer( uri, name, type, options, providerKey ) );
}
4). 将图层图像通过QgsProject::addMapLayer添加到图层中
result = qobject_cast< T * >( QgsMapLayerFactory::createLayer( uri, name, type, options, providerKey ) );
if(result)
{
......
QgsProject::instance()->addMapLayer( result );
askUserForDatumTransform( result->crs(), QgsProject::instance()->crs(), result );
postProcessAddedLayer( result );
}
网友评论