37 , mGridSettings( this )
42 setBackgroundBrush( Qt::NoBrush );
49 mUndoStack->blockCommands(
true );
51 deleteAndRemoveMultiFrames();
59 QList<QGraphicsItem *> itemList = items();
64 for ( QGraphicsItem *item : qgis::as_const( itemList ) )
66 if ( dynamic_cast< QgsLayoutItem * >( item ) && !dynamic_cast< QgsLayoutItemPage *>( item ) )
81 QDomDocument currentDoc;
84 QDomElement elem =
writeXml( currentDoc, context );
85 currentDoc.appendChild( elem );
87 std::unique_ptr< QgsLayout > newLayout = qgis::make_unique< QgsLayout >( mProject );
89 newLayout->loadFromTemplate( currentDoc, context,
true, &ok );
95 return newLayout.release();
103 mPageCollection->addPage( page );
104 mUndoStack->stack()->clear();
109 deleteAndRemoveMultiFrames();
112 const QList<QGraphicsItem *> itemList = items();
113 for ( QGraphicsItem *item : itemList )
117 if ( cItem && !pItem )
119 removeLayoutItemPrivate( cItem );
122 mItemsModel->clear();
124 mPageCollection->clear();
125 mUndoStack->stack()->clear();
135 return mItemsModel.get();
140 QList<QgsLayoutItem *> layoutItemList;
142 const QList<QGraphicsItem *> graphicsItemList = selectedItems();
143 for ( QGraphicsItem *item : graphicsItemList )
146 if ( layoutItem && ( includeLockedItems || !layoutItem->
isLocked() ) )
148 layoutItemList.push_back( layoutItem );
152 return layoutItemList;
171 const QList<QGraphicsItem *> selectedItemList = selectedItems();
172 for ( QGraphicsItem *item : selectedItemList )
174 if (
QgsLayoutItem *layoutItem = dynamic_cast<QgsLayoutItem *>( item ) )
176 layoutItem->setSelected(
false );
185 bool result = mItemsModel->reorderItemUp( item );
186 if ( result && !deferUpdate )
198 bool result = mItemsModel->reorderItemDown( item );
199 if ( result && !deferUpdate )
211 bool result = mItemsModel->reorderItemToTop( item );
212 if ( result && !deferUpdate )
224 bool result = mItemsModel->reorderItemToBottom( item );
225 if ( result && !deferUpdate )
236 QList<QgsLayoutItem *> itemList;
240 if ( item->uuid() == uuid )
242 else if ( includeTemplateUuids && item->mTemplateUuid == uuid )
251 QList<QgsLayoutItem *> itemList;
255 if ( item->mTemplateUuid == uuid )
264 const QList<QGraphicsItem *> itemList = items();
265 for ( QGraphicsItem *item : itemList )
268 if ( layoutItem && layoutItem->
id() == id )
280 if ( mf->uuid() == uuid )
282 else if ( includeTemplateUuids && mf->mTemplateUuid == uuid )
297 const QList<QGraphicsItem *> itemList = items( position, Qt::IntersectsItemShape, Qt::DescendingOrder );
299 bool foundBelowItem =
false;
300 for ( QGraphicsItem *graphicsItem : itemList )
304 if ( layoutItem && !paperItem )
308 if ( ( ! belowItem || foundBelowItem ) && ( !ignoreLocked || !layoutItem->
isLocked() ) )
314 if ( layoutItem == belowItem )
317 foundBelowItem =
true;
357 return *mRenderContext;
362 return *mRenderContext;
367 return *mReportContext;
372 return *mReportContext;
378 mPageCollection->redraw();
383 return mPageCollection->guides();
388 return mPageCollection->guides();
396 if ( mReportContext->
layer() )
405 mCustomProperties.
setValue( key, value );
407 if ( key.startsWith( QLatin1String(
"variable" ) ) )
413 return mCustomProperties.
value( key, defaultValue );
418 mCustomProperties.
remove( key );
423 return mCustomProperties.
keys();
433 QList< QgsLayoutItemMap * > maps;
436 double largestMapArea = 0;
439 double area = map->rect().width() * map->rect().height();
440 if ( area > largestMapArea )
442 largestMapArea = area;
451 mWorldFileMapId = map ? map->
uuid() : QString();
457 return mPageCollection.get();
462 return mPageCollection.get();
471 Q_FOREACH (
const QGraphicsItem *item, items() )
478 if ( !isPage || !ignorePages )
486 itemBounds = layoutItem->mapToScene( layoutItem->rect() ).boundingRect();
489 itemBounds = item->sceneBoundingRect();
491 if ( bounds.isValid() )
492 bounds = bounds.united( itemBounds );
498 if ( bounds.isValid() && margin > 0.0 )
501 double maxWidth = mPageCollection->maximumPageWidth();
502 bounds.adjust( -maxWidth * margin, -maxWidth * margin, maxWidth * margin, maxWidth * margin );
515 const QList<QGraphicsItem *> itemList = items();
516 for ( QGraphicsItem *item : itemList )
521 if ( visibleOnly && !layoutItem->isVisible() )
525 if ( bounds.isValid() )
526 bounds = bounds.united( item->sceneBoundingRect() );
528 bounds = item->sceneBoundingRect();
537 addLayoutItemPrivate( item );
541 undoText = tr(
"Create %1" ).arg( metadata->visibleName() );
545 undoText = tr(
"Create Item" );
547 if ( !mUndoStack->isBlocked() )
553 std::unique_ptr< QgsLayoutItemDeleteUndoCommand > deleteCommand;
554 if ( !mUndoStack->isBlocked() )
556 mUndoStack->beginMacro( tr(
"Delete Items" ) );
559 removeLayoutItemPrivate( item );
562 mUndoStack->push( deleteCommand.release() );
563 mUndoStack->endMacro();
572 if ( !mMultiFrames.contains( multiFrame ) )
573 mMultiFrames << multiFrame;
578 mMultiFrames.removeAll( multiFrame );
588 QFile templateFile( path );
589 if ( !templateFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
594 QDomDocument saveDocument;
595 QDomElement elem =
writeXml( saveDocument, context );
596 saveDocument.appendChild( elem );
598 if ( templateFile.write( saveDocument.toByteArray() ) == -1 )
609 QList< QgsLayoutItem * > result;
629 QDomNodeList itemsNodes = doc.elementsByTagName( QStringLiteral(
"LayoutItem" ) );
630 for (
int i = 0; i < itemsNodes.count(); ++i )
632 QDomNode itemNode = itemsNodes.at( i );
633 if ( itemNode.isElement() )
635 itemNode.toElement().removeAttribute( QStringLiteral(
"uuid" ) );
638 QDomNodeList multiFrameNodes = doc.elementsByTagName( QStringLiteral(
"LayoutMultiFrame" ) );
639 for (
int i = 0; i < multiFrameNodes.count(); ++i )
641 QDomNode multiFrameNode = multiFrameNodes.at( i );
642 if ( multiFrameNode.isElement() )
644 multiFrameNode.toElement().removeAttribute( QStringLiteral(
"uuid" ) );
645 QDomNodeList frameNodes = multiFrameNode.toElement().elementsByTagName( QStringLiteral(
"childFrame" ) );
646 QDomNode itemNode = frameNodes.at( i );
647 if ( itemNode.isElement() )
649 itemNode.toElement().removeAttribute( QStringLiteral(
"uuid" ) );
657 QDomElement layoutElem = doc.documentElement();
658 if ( layoutElem.isNull() )
663 bool loadOk =
readXml( layoutElem, doc, context );
683 return mUndoStack.get();
688 return mUndoStack.get();
703 void saveState( QDomDocument &stateDoc )
const override 706 QDomElement documentElement = stateDoc.createElement( QStringLiteral(
"UndoState" ) );
708 stateDoc.appendChild( documentElement );
711 void restoreState( QDomDocument &stateDoc )
override 718 mLayout->readXmlLayoutSettings( stateDoc.documentElement(), stateDoc,
QgsReadWriteContext() );
719 mLayout->project()->setDirty(
true );
735 if ( items.size() < 2 )
741 mUndoStack->beginMacro( tr(
"Group Items" ) );
745 itemGroup->addItem( item );
750 std::unique_ptr< QgsLayoutItemGroupUndoCommand > c(
new QgsLayoutItemGroupUndoCommand( QgsLayoutItemGroupUndoCommand::Grouped, returnGroup,
this, tr(
"Group Items" ) ) );
751 mUndoStack->push( c.release() );
752 mProject->setDirty(
true );
754 mUndoStack->endMacro();
761 QList<QgsLayoutItem *> ungroupedItems;
764 return ungroupedItems;
767 mUndoStack->beginMacro( tr(
"Ungroup Items" ) );
770 std::unique_ptr< QgsLayoutItemGroupUndoCommand > c(
new QgsLayoutItemGroupUndoCommand( QgsLayoutItemGroupUndoCommand::Ungrouped, group,
this, tr(
"Ungroup Items" ) ) );
771 mUndoStack->push( c.release() );
773 mProject->setDirty(
true );
775 ungroupedItems = group->
items();
779 mUndoStack->endMacro();
781 return ungroupedItems;
786 mUndoStack->blockCommands(
true );
787 mPageCollection->beginPageSizeChange();
789 mPageCollection->reflow();
790 mPageCollection->endPageSizeChange();
791 mUndoStack->blockCommands(
false );
795 void QgsLayout::writeXmlLayoutSettings( QDomElement &element, QDomDocument &document,
const QgsReadWriteContext & )
const 797 mCustomProperties.writeXml( element, document );
799 element.setAttribute( QStringLiteral(
"worldFileMap" ), mWorldFileMapId );
800 element.setAttribute( QStringLiteral(
"printResolution" ), mRenderContext->dpi() );
805 QDomElement element = document.createElement( QStringLiteral(
"Layout" ) );
808 return object->writeXml( element, document, context );
811 save( &mGridSettings );
812 save( mPageCollection.get() );
815 const QList<QGraphicsItem *> itemList = items();
816 for (
const QGraphicsItem *graphicsItem : itemList )
818 if (
const QgsLayoutItem *item = dynamic_cast< const QgsLayoutItem *>( graphicsItem ) )
823 item->writeXml( element, document, context );
830 mf->writeXml( element, document, context );
833 writeXmlLayoutSettings( element, document, context );
837 bool QgsLayout::readXmlLayoutSettings(
const QDomElement &layoutElement,
const QDomDocument &,
const QgsReadWriteContext & )
839 mCustomProperties.readXml( layoutElement );
841 mWorldFileMapId = layoutElement.attribute( QStringLiteral(
"worldFileMap" ) );
842 mRenderContext->setDpi( layoutElement.attribute( QStringLiteral(
"printResolution" ),
"300" ).toDouble() );
852 mItemsModel->rebuildZList();
855 void QgsLayout::removeLayoutItemPrivate(
QgsLayoutItem *item )
857 mItemsModel->setItemRemoved( item );
864 emit itemRemoved( item );
870 void QgsLayout::deleteAndRemoveMultiFrames()
872 qDeleteAll( mMultiFrames );
873 mMultiFrames.clear();
876 QPointF QgsLayout::minPointFromXml(
const QDomElement &elem )
const 878 double minX = std::numeric_limits<double>::max();
879 double minY = std::numeric_limits<double>::max();
880 const QDomNodeList itemList = elem.elementsByTagName( QStringLiteral(
"LayoutItem" ) );
882 for (
int i = 0; i < itemList.size(); ++i )
884 const QDomElement currentItemElem = itemList.at( i ).toElement();
889 minX = std::min( minX, layoutPoint.x() );
890 minY = std::min( minY, layoutPoint.y() );
893 return found ? QPointF( minX, minY ) : QPointF( 0, 0 );
898 int counter = mItemsModel->zOrderListSize();
899 const QList<QgsLayoutItem *> zOrderList = mItemsModel->zOrderList();
901 if ( addUndoCommands )
903 mUndoStack->beginMacro( tr(
"Change Item Stacking" ) );
909 if ( addUndoCommands )
911 mUndoStack->beginCommand( currentItem, QString() );
913 currentItem->setZValue( counter );
914 if ( addUndoCommands )
916 mUndoStack->endCommand();
921 if ( addUndoCommands )
923 mUndoStack->endMacro();
929 if ( layoutElement.nodeName() != QStringLiteral(
"Layout" ) )
936 return object->readXml( layoutElement, document, context );
939 blockSignals(
true );
940 readXmlLayoutSettings( layoutElement, document, context );
941 blockSignals(
false );
943 restore( mPageCollection.get() );
944 restore( &mSnapper );
945 restore( &mGridSettings );
955 QList< QgsLayoutItem * > newItems;
956 QList< QgsLayoutMultiFrame * > newMultiFrames;
961 int zOrderOffset = mItemsModel->zOrderListSize();
963 QPointF pasteShiftPos;
970 QPointF minItemPos = minPointFromXml( parentElement );
973 pasteShiftPos = *position - minItemPos;
976 pageNumber = mPageCollection->pageNumberForPoint( *position );
982 const QDomNodeList multiFrameList = parentElement.elementsByTagName( QStringLiteral(
"LayoutMultiFrame" ) );
983 for (
int i = 0; i < multiFrameList.size(); ++i )
985 const QDomElement multiFrameElem = multiFrameList.at( i ).toElement();
986 const int itemType = multiFrameElem.attribute( QStringLiteral(
"type" ) ).toInt();
993 mf->readXml( multiFrameElem, document, context );
996 mf->setCreateUndoCommands(
true );
1011 newMultiFrames << m;
1014 const QDomNodeList layoutItemList = parentElement.childNodes();
1015 for (
int i = 0; i < layoutItemList.size(); ++i )
1017 const QDomElement currentItemElem = layoutItemList.at( i ).toElement();
1018 if ( currentItemElem.nodeName() != QStringLiteral(
"LayoutItem" ) )
1021 const int itemType = currentItemElem.attribute( QStringLiteral(
"type" ) ).toInt();
1029 item->readXml( currentItemElem, document, context );
1035 item->attemptMove( posOnPage,
true,
false, pageNumber );
1039 item->attemptMoveBy( pasteShiftPos.x(), pasteShiftPos.y() );
1045 layoutItem->setZValue( layoutItem->zValue() + zOrderOffset );
1046 newItems << layoutItem;
1059 mf->finalizeRestoreFromXml();
1064 item->mTemplateUuid.clear();
1068 mf->mTemplateUuid.clear();
1074 mItemsModel->rebuildZList();
void setDirty(bool b=true)
Flag the project as dirty (modified).
The class is used as a container of context for various read/write operations on other objects...
void removeItems()
Removes all items from the group (but does not delete them).
void setSelectedItem(QgsLayoutItem *item)
Clears any selected items and sets item as the current selection.
bool raiseItem(QgsLayoutItem *item, bool deferUpdate=false)
Raises an item up the z-order.
QgsLayoutGuideCollection & guides()
Returns a reference to the layout's guide collection, which manages page snap guides.
QgsLayoutItem * itemById(const QString &id) const
Returns a layout item given its id.
QRectF layoutBounds(bool ignorePages=false, double margin=0.0) const
Calculates the bounds of all non-gui items in the layout.
QgsLayout * clone() const
Creates a clone of the layout.
Base class for graphical items within a QgsLayout.
int type() const override
Returns a unique graphics item type identifier.
QgsLayoutMultiFrame * multiFrameByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout multiframe with matching uuid unique identifier, or a nullptr if a matching multif...
Base class for commands to undo/redo layout and layout object changes.
QgsLayoutUndoStack * undoStack()
Returns a pointer to the layout's undo stack, which manages undo/redo states for the layout and it's ...
friend class QgsLayoutModel
QVariant customProperty(const QString &key, const QVariant &defaultValue=QVariant()) const
Read a custom property from the layout.
Stores information relating to the current reporting context for a layout.
QgsLayoutItemGroup * groupItems(const QList< QgsLayoutItem *> &items)
Creates a new group from a list of layout items and adds the group to the layout. ...
virtual bool readXml(const QDomElement &layoutElement, const QDomDocument &document, const QgsReadWriteContext &context)
Sets the collection's state from a DOM element.
An undo stack for QgsLayouts.
QgsLayoutItem * itemByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout item with matching uuid unique identifier, or a nullptr if a matching item could n...
void loadFromSettings()
Loads grid settings from the application layout settings.
A container for grouping several QgsLayoutItems.
static QDomDocument convertCompositionTemplate(const QDomDocument &document, QgsProject *project)
Convert a composition template document to a layout template.
virtual void setSelected(bool selected)
Sets whether the item should be selected.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
Return value for the given key. If the key is not stored, default value will be used.
QgsLayoutMeasurement convert(const QgsLayoutMeasurement &measurement, const QgsUnitTypes::LayoutUnit targetUnits) const
Converts a measurement from one unit to another.
QList< QgsLayoutItem *> addItemsFromXml(const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext &context, QPointF *position=nullptr, bool pasteInPlace=false)
Add items from an XML representation to the layout.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
void setUnits(QgsUnitTypes::LayoutUnit units)
Sets the native measurement units for the layout.
QList< QgsLayoutItem * > ungroupItems(QgsLayoutItemGroup *group)
Ungroups items by removing them from an item group and removing the group from the layout...
void updateBounds()
Updates the scene bounds of the layout.
QgsLayoutRenderContext & renderContext()
Returns a reference to the layout's render context, which stores information relating to the current ...
void remove(const QString &key)
Remove a key (entry) from the store.
double convertToLayoutUnits(const QgsLayoutMeasurement &measurement) const
Converts a measurement into the layout's native units.
QList< QgsLayoutMultiFrame *> multiFrames() const
Returns a list of multi frames contained in the layout.
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
This class provides a method of storing points, consisting of an x and y coordinate, for use in QGIS layouts.
void layoutItems(QList< T *> &itemList) const
Returns a list of layout items of a specific type.
void removeCustomProperty(const QString &key)
Remove a custom property from the layout.
void deselectAll()
Clears any selected items in the layout.
QgsVectorLayer * layer() const
Returns the vector layer associated with the layout's context.
static QgsLayoutItemRegistry * layoutItemRegistry()
Returns the application's layout item registry, used for layout item types.
Layout graphical items for displaying a map.
void setValue(const QString &key, const QVariant &value)
Add an entry to the store. If the entry with the keys exists already, it will be overwritten.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context...
QgsLayoutItem * layoutItemAt(QPointF position, const bool ignoreLocked=false) const
Returns the topmost layout item at a specified position.
void variablesChanged()
Emitted whenever the expression variables stored in the layout have been changed. ...
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
static bool isCompositionTemplate(const QDomDocument &document)
Check if the given document is a composition template.
static Q_INVOKABLE QgsUnitTypes::LayoutUnit decodeLayoutUnit(const QString &string, bool *ok=nullptr)
Decodes a layout unit from a string.
void refresh()
Forces the layout, and all items contained within it, to refresh.
QStringList customProperties() const
Return list of keys stored in custom properties for the layout.
QList< QgsLayoutItem * > items() const
Returns a list of items contained by the group.
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout's page collection, which stores and manages page items in the layout...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QList< QgsLayoutItem *> loadFromTemplate(const QDomDocument &document, const QgsReadWriteContext &context, bool clearExisting=true, bool *ok=nullptr)
Load a layout template document.
void selectedItemChanged(QgsLayoutItem *selected)
Emitted whenever the selected item changes.
virtual void cleanup()
Called just before a batch of items are deleted, allowing them to run cleanup tasks.
void updateZValues(const bool addUndoCommands=true)
Resets the z-values of items based on their position in the internal z order list.
void removeMultiFrame(QgsLayoutMultiFrame *multiFrame)
Removes a multiFrame from the layout (but does not delete it).
Stores and manages the snap guides used by a layout.
Reads and writes project states.
int page() const
Returns the page the item is currently on, with the first page returning 0.
QString id() const
Returns the item's ID name.
QList< QgsLayoutItem * > selectedLayoutItems(const bool includeLockedItems=true)
Returns list of selected layout items.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
QStringList keys() const
Return list of stored keys.
A manager for a collection of pages in a layout.
QRectF pageItemBounds(int page, bool visibleOnly=false) const
Returns the bounding box of the items contained on a specified page.
bool lowerItem(QgsLayoutItem *item, bool deferUpdate=false)
Lowers an item down the z-order.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
QgsLayoutModel * itemsModel()
Returns the items model attached to the layout.
friend class QgsLayoutItemAddItemCommand
virtual void finalizeRestoreFromXml()
Called after all pending items have been restored from XML.
QgsLayoutReportContext & reportContext()
Returns a reference to the layout's report context, which stores information relating to the current ...
friend class QgsLayoutUndoCommand
QgsExpressionContext createExpressionContext() const override
Creates an expression context relating to the layout's current state.
bool moveItemToBottom(QgsLayoutItem *item, bool deferUpdate=false)
Lowers an item down to the bottom of the z-order.
void clear()
Clears the layout.
QgsLayoutItemMap * referenceMap() const
Returns the map item which will be used to generate corresponding world files when the layout is expo...
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
double length() const
Returns the length of the measurement.
bool saveAsTemplate(const QString &path, const QgsReadWriteContext &context) const
Saves the layout as a template at the given file path.
const QgsLayoutMeasurementConverter & measurementConverter() const
Returns the layout measurement converter to be used in the layout.
void removeLayoutItem(QgsLayoutItem *item)
Removes an item from the layout.
static QgsExpressionContextScope * layoutScope(const QgsLayout *layout)
Creates a new scope which contains variables and functions relating to a QgsLayout layout...
void refreshed()
Is emitted when the layout has been refreshed and items should also be refreshed and updated...
friend class QgsLayoutItemGroupUndoCommand
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
virtual QString uuid() const
Returns the item identification string.
QgsLayoutMeasurement convertFromLayoutUnits(const double length, const QgsUnitTypes::LayoutUnit unit) const
Converts a length measurement from the layout's native units to a specified target unit...
void addLayoutItem(QgsLayoutItem *item)
Adds an item to the layout.
Stores information relating to the current rendering settings for a layout.
void setReferenceMap(QgsLayoutItemMap *map)
Sets the map item which will be used to generate corresponding world files when the layout is exporte...
An interface for layout objects which can be stored and read from DOM elements.
void initializeDefaults()
Initializes an empty layout, e.g.
QgsProject * project() const
The project associated with the layout.
void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for the layout.
LayoutUnit
Layout measurement units.
virtual QDomElement writeXml(QDomDocument &document, const QgsReadWriteContext &context) const
Returns the layout's state encapsulated in a DOM element.
bool isLocked() const
Returns true if the item is locked, and cannot be interacted with using the mouse.
QgsAbstractLayoutUndoCommand * createCommand(const QString &text, int id=0, QUndoCommand *parent=nullptr) override
Creates a new layout undo command with the specified text and parent.
void setPageSize(const QgsLayoutSize &size)
Sets the size of the page.
A model for items attached to a layout.
Manages snapping grids and preset snap lines in a layout, and handles snapping points to the nearest ...
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
void changed()
Is emitted when properties of the layout change.
bool moveItemToTop(QgsLayoutItem *item, bool deferUpdate=false)
Raises an item up to the top of the z-order.
QgsLayoutItem * itemByTemplateUuid(const QString &uuid) const
Returns the layout item with matching template uuid unique identifier, or a nullptr if a matching ite...
void reloadSettings()
Refreshes the layout when global layout related options change.
void addMultiFrame(QgsLayoutMultiFrame *multiFrame)
Adds a multiFrame to the layout.
QgsLayout(QgsProject *project)
Construct a new layout linked to the specified project.
static QgsLayoutPoint decodePoint(const QString &string)
Decodes a point from a string.
Item representing the paper in a layout.
friend class QgsLayoutItemDeleteUndoCommand