QgsAttributeEditorElement* QgsEditFormConfig::attributeEditorElementFromDomElement( QDomElement &elem, QObject* parent ) { QgsAttributeEditorElement* newElement = nullptr; if ( elem.tagName() == "attributeEditorContainer" ) { QgsAttributeEditorContainer* container = new QgsAttributeEditorContainer( elem.attribute( "name" ), parent ); QDomNodeList childNodeList = elem.childNodes(); for ( int i = 0; i < childNodeList.size(); i++ ) { QDomElement childElem = childNodeList.at( i ).toElement(); QgsAttributeEditorElement *myElem = attributeEditorElementFromDomElement( childElem, container ); if ( myElem ) container->addChildElement( myElem ); } newElement = container; } else if ( elem.tagName() == "attributeEditorField" ) { QString name = elem.attribute( "name" ); int idx = mFields.fieldNameIndex( name ); newElement = new QgsAttributeEditorField( name, idx, parent ); } else if ( elem.tagName() == "attributeEditorRelation" ) { // At this time, the relations are not loaded // So we only grab the id and delegate the rest to onRelationsLoaded() QString name = elem.attribute( "name" ); newElement = new QgsAttributeEditorRelation( name, elem.attribute( "relation", "[None]" ), parent ); } return newElement; }
Q_FOREACH ( QgsAttributeEditorElement* elem, mAttributeEditorElements ) { if ( elem->type() == QgsAttributeEditorElement::AeTypeContainer ) { QgsAttributeEditorContainer* cont = dynamic_cast< QgsAttributeEditorContainer* >( elem ); if ( !cont ) continue; QList<QgsAttributeEditorElement*> relations = cont->findElements( QgsAttributeEditorElement::AeTypeRelation ); Q_FOREACH ( QgsAttributeEditorElement* relElem, relations ) { QgsAttributeEditorRelation* rel = dynamic_cast< QgsAttributeEditorRelation* >( relElem ); if ( !rel ) continue; rel->init( QgsProject::instance()->relationManager() ); }
QList<QgsAttributeEditorElement*> QgsAttributeEditorContainer::findElements( QgsAttributeEditorElement::AttributeEditorType type ) const { QList<QgsAttributeEditorElement*> results; Q_FOREACH ( QgsAttributeEditorElement* elem, mChildren ) { if ( elem->type() == type ) { results.append( elem ); } if ( elem->type() == AeTypeContainer ) { QgsAttributeEditorContainer* cont = dynamic_cast<QgsAttributeEditorContainer*>( elem ); if ( cont ) results += cont->findElements( type ); } } return results; }