diff --git a/python/core/auto_generated/qgsproject.sip.in b/python/core/auto_generated/qgsproject.sip.in index 717b54f10ed..54de468f9b9 100644 --- a/python/core/auto_generated/qgsproject.sip.in +++ b/python/core/auto_generated/qgsproject.sip.in @@ -237,6 +237,7 @@ Clears the project, removing all settings and resetting it back to an empty, def enum ReadFlag { FlagDontResolveLayers, + FlagDontLoadLayouts, }; typedef QFlags ReadFlags; diff --git a/src/core/qgsproject.cpp b/src/core/qgsproject.cpp index dfdd130f97d..144a820297b 100644 --- a/src/core/qgsproject.cpp +++ b/src/core/qgsproject.cpp @@ -1417,7 +1417,8 @@ bool QgsProject::readProjectFile( const QString &filename, QgsProject::ReadFlags emit labelingEngineSettingsChanged(); mAnnotationManager->readXml( doc->documentElement(), context ); - mLayoutManager->readXml( doc->documentElement(), *doc ); + if ( !( flags & QgsProject::FlagDontLoadLayouts ) ) + mLayoutManager->readXml( doc->documentElement(), *doc ); mBookmarkManager->readXml( doc->documentElement(), *doc ); // reassign change dependencies now that all layers are loaded diff --git a/src/core/qgsproject.h b/src/core/qgsproject.h index 2d7dce8adf5..82eb909a2a3 100644 --- a/src/core/qgsproject.h +++ b/src/core/qgsproject.h @@ -272,6 +272,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera enum ReadFlag { FlagDontResolveLayers = 1 << 0, //!< Don't resolve layer paths (i.e. don't load any layer content). Dramatically improves project read time if the actual data from the layers is not required. + FlagDontLoadLayouts = 1 << 1, //!< Don't load print layouts. Improves project read time if layouts are not required, and allows projects to be safely read in background threads (since print layouts are not thread safe). }; Q_DECLARE_FLAGS( ReadFlags, ReadFlag ) diff --git a/tests/src/core/testqgsproject.cpp b/tests/src/core/testqgsproject.cpp index 09ee8e1aeb0..8a290b5080a 100644 --- a/tests/src/core/testqgsproject.cpp +++ b/tests/src/core/testqgsproject.cpp @@ -25,6 +25,7 @@ #include "qgsunittypes.h" #include "qgsvectorlayer.h" #include "qgssymbollayerutils.h" +#include "qgslayoutmanager.h" class TestQgsProject : public QObject { @@ -457,6 +458,12 @@ void TestQgsProject::testReadFlags() QVERIFY( !layers.value( QStringLiteral( "polys20170310142652234" ) )->isValid() ); QCOMPARE( qobject_cast< QgsVectorLayer * >( layers.value( QStringLiteral( "lines20170310142652255" ) ) )->renderer()->type(), QStringLiteral( "categorizedSymbol" ) ); QCOMPARE( qobject_cast< QgsVectorLayer * >( layers.value( QStringLiteral( "polys20170310142652234" ) ) )->renderer()->type(), QStringLiteral( "categorizedSymbol" ) ); + + + QString project3Path = QString( TEST_DATA_DIR ) + QStringLiteral( "/layouts/layout_casting.qgs" ); + QgsProject p3; + QVERIFY( p3.read( project3Path, QgsProject::FlagDontLoadLayouts ) ); + QCOMPARE( p3.layoutManager()->layouts().count(), 0 ); } void TestQgsProject::testSetGetCrs()