38#include <QCoreApplication>
39#include <QDomDocument>
43#include <QImageReader>
44#include <QNetworkReply>
45#include <QNetworkRequest>
48#include <QSvgRenderer>
51#include "moc_qgslayoutitempicture.cpp"
53using namespace Qt::StringLiterals;
90QPainterPath QgsLayoutItemPicture::customFramePath()
const
92 QPainterPath painterPath;
93 if ( mClipToItem && mClippingItem )
96 g.transform( sceneTransform().inverted() );
99 painterPath = g.constGet()->asQPainterPath();
107 QPainterPath custumPainterPath = customFramePath();
119 const QPainterPath custumPainterPath = customFramePath();
120 if ( !custumPainterPath.isEmpty() )
122 painter->setClipPath( custumPainterPath );
125 const bool prevSmoothTransform = painter->testRenderHint( QPainter::RenderHint::SmoothPixmapTransform );
127 painter->setRenderHint( QPainter::RenderHint::SmoothPixmapTransform,
true );
132 double boundRectWidthMM;
133 double boundRectHeightMM;
137 boundRectWidthMM = mPictureWidth;
138 boundRectHeightMM = mPictureHeight;
139 imageRect = QRect( 0, 0, mImage.width(), mImage.height() );
143 boundRectWidthMM = rect().width();
144 boundRectHeightMM = rect().height();
145 imageRect = QRect( 0, 0, mImage.width(), mImage.height() );
149 boundRectWidthMM = rect().width();
150 boundRectHeightMM = rect().height();
151 const int imageRectWidthPixels = mImage.width();
152 const int imageRectHeightPixels = mImage.height();
153 imageRect = clippedImageRect( boundRectWidthMM, boundRectHeightMM, QSize( imageRectWidthPixels, imageRectHeightPixels ) );
157 boundRectWidthMM = rect().width();
158 boundRectHeightMM = rect().height();
168 if ( mResizeMode ==
Zoom )
174 painter->translate( rect().width() / 2.0, rect().height() / 2.0 );
175 painter->rotate( mPictureRotation );
176 painter->translate( -boundRectWidthMM / 2.0, -boundRectHeightMM / 2.0 );
181 const double diffX = rect().width() - boundRectWidthMM;
182 const double diffY = rect().height() - boundRectHeightMM;
186 switch ( mPictureAnchor )
204 switch ( mPictureAnchor )
222 painter->translate( dX, dY );
229 painter->translate( rect().width() / 2.0, rect().height() / 2.0 );
230 painter->rotate( mPictureRotation );
231 painter->translate( -boundRectWidthMM / 2.0, -boundRectHeightMM / 2.0 );
237 mSVG.render( painter, QRectF( 0, 0, boundRectWidthMM, boundRectHeightMM ) );
241 painter->drawImage( QRectF( 0, 0, boundRectWidthMM, boundRectHeightMM ), mImage, imageRect );
244 painter->setRenderHint( QPainter::RenderHint::SmoothPixmapTransform, prevSmoothTransform );
249 const QSizeF currentPictureSize = pictureSize();
250 QSizeF newSize = targetSize;
253 mPictureWidth = targetSize.width();
254 mPictureHeight = targetSize.height();
258 if ( mResizeMode ==
ZoomResizeFrame && !rect().isEmpty() && !( currentPictureSize.isEmpty() ) )
260 QSizeF targetImageSize;
263 targetImageSize = currentPictureSize;
269 tr.rotate( mPictureRotation );
270 const QRectF rotatedBounds = tr.mapRect( QRectF( 0, 0, currentPictureSize.width(), currentPictureSize.height() ) );
271 targetImageSize = QSizeF( rotatedBounds.width(), rotatedBounds.height() );
276 if ( std::fabs( rect().width() - targetSize.width() ) < std::fabs( rect().height() - targetSize.height() ) )
278 newSize.setHeight( targetImageSize.height() * newSize.width() / targetImageSize.width() );
282 newSize.setWidth( targetImageSize.width() * newSize.height() / targetImageSize.height() );
287 if ( !( currentPictureSize.isEmpty() ) )
290 newSize.setWidth( sizeMM.
width() * 25.4 /
mLayout->renderContext().dpi() );
291 newSize.setHeight( sizeMM.
height() * 25.4 /
mLayout->renderContext().dpi() );
298 const QRectF rotatedImageRect
300 mPictureWidth = rotatedImageRect.width();
301 mPictureHeight = rotatedImageRect.height();
305 mPictureWidth = newSize.width();
306 mPictureHeight = newSize.height();
309 if ( newSize != targetSize )
318QRect QgsLayoutItemPicture::clippedImageRect(
double &boundRectWidthMM,
double &boundRectHeightMM, QSize imageRectPixels )
320 const int boundRectWidthPixels = boundRectWidthMM *
mLayout->renderContext().dpi() / 25.4;
321 const int boundRectHeightPixels = boundRectHeightMM *
mLayout->renderContext().dpi() / 25.4;
324 boundRectWidthMM = boundRectWidthPixels * 25.4 /
mLayout->renderContext().dpi();
325 boundRectHeightMM = boundRectHeightPixels * 25.4 /
mLayout->renderContext().dpi();
332 switch ( mPictureAnchor )
342 leftClip = ( imageRectPixels.width() - boundRectWidthPixels ) / 2;
347 leftClip = imageRectPixels.width() - boundRectWidthPixels;
352 switch ( mPictureAnchor )
362 topClip = ( imageRectPixels.height() - boundRectHeightPixels ) / 2;
367 topClip = imageRectPixels.height() - boundRectHeightPixels;
371 return QRect( leftClip, topClip, boundRectWidthPixels, boundRectHeightPixels );
381 QVariant source( mSourcePath );
384 mHasExpressionError =
false;
390 source = sourceProperty.
value( *evalContext, source, &ok );
391 if ( !ok || !source.canConvert( QMetaType::QString ) )
393 mHasExpressionError =
true;
400 else if ( source.userType() != QMetaType::Type::QByteArray )
402 source = source.toString().trimmed();
403 QgsDebugMsgLevel( u
"exprVal PictureSource:%1"_s.arg( source.toString() ), 2 );
407 loadPicture( source );
410void QgsLayoutItemPicture::loadRemotePicture(
const QString &url )
420 loop.exec( QEventLoop::ExcludeUserInputEvents );
422 QNetworkReply *reply = fetcher.
reply();
425 QImageReader imageReader( reply );
426 imageReader.setAutoTransform(
true );
428 if ( imageReader.format() ==
"pdf" )
437 const QSize sizeAt72Dpi = imageReader.size();
438 const QSize sizeAtTargetDpi = sizeAt72Dpi *
mLayout->renderContext().dpi() / 72;
439 imageReader.setScaledSize( sizeAtTargetDpi );
442 mImage = imageReader.read();
451void QgsLayoutItemPicture::loadLocalPicture(
const QString &path )
454 pic.setFileName( path );
462 const QFileInfo sourceFileInfo( pic );
463 const QString sourceFileSuffix = sourceFileInfo.suffix();
464 if ( sourceFileSuffix.compare(
"svg"_L1, Qt::CaseInsensitive ) == 0 )
473 const QByteArray &svgContent =
QgsApplication::svgCache()->
svgContent( path, rect().width(), fillColor, strokeColor, strokeWidth, 1.0, 0,
false, evaluatedParameters );
474 mSVG.load( svgContent );
475 if ( mSVG.isValid() )
478 const QRect viewBox = mSVG.viewBox();
479 mDefaultSvgSize.setWidth( viewBox.width() );
480 mDefaultSvgSize.setHeight( viewBox.height() );
490 QImageReader imageReader( pic.fileName() );
491 imageReader.setAutoTransform(
true );
493 if ( imageReader.format() ==
"pdf" )
502 const QSize sizeAt72Dpi = imageReader.size();
503 const QSize sizeAtTargetDpi = sizeAt72Dpi *
mLayout->renderContext().dpi() / 72;
504 imageReader.setScaledSize( sizeAtTargetDpi );
507 if ( imageReader.read( &mImage ) )
519void QgsLayoutItemPicture::loadPictureUsingCache(
const QString &path )
521 if ( path.isEmpty() )
524 mSVG.load( QByteArray() );
535 bool fitsInCache =
false;
536 bool isMissing =
false;
538 if ( mImage.isNull() || isMissing )
554 mSVG.load( svgContent );
558 const QRect viewBox = mSVG.viewBox();
559 mDefaultSvgSize.setWidth( viewBox.width() );
560 mDefaultSvgSize.setHeight( viewBox.height() );
571void QgsLayoutItemPicture::updateNorthArrowRotation(
double rotation )
577void QgsLayoutItemPicture::loadPicture(
const QVariant &data )
579 mIsMissingImage =
false;
580 QVariant imageData( data );
581 mEvaluatedPath = data.toString();
585 const QByteArray base64 = mEvaluatedPath.mid( 7 ).toLocal8Bit();
586 imageData = QByteArray::fromBase64( base64, QByteArray::OmitTrailingEquals );
589 if ( imageData.userType() == QMetaType::Type::QByteArray )
591 if ( mImage.loadFromData( imageData.toByteArray() ) )
599 loadRemotePicture( mEvaluatedPath );
604 loadLocalPicture( mEvaluatedPath );
608 loadPictureUsingCache( mEvaluatedPath );
617 else if ( mHasExpressionError || !mEvaluatedPath.isEmpty() )
620 mIsMissingImage =
true;
623 const QString badFile( u
":/images/composer/missing_image.png"_s );
624 QImageReader imageReader( badFile );
625 if ( imageReader.read( &mImage ) )
630 const QString badFile( u
":/images/composer/missing_image.svg"_s );
631 mSVG.load( badFile );
632 if ( mSVG.isValid() )
635 const QRect viewBox = mSVG.viewBox();
636 mDefaultSvgSize.setWidth( viewBox.width() );
637 mDefaultSvgSize.setHeight( viewBox.height() );
647QSizeF QgsLayoutItemPicture::pictureSize()
651 return mDefaultSvgSize;
655 return QSizeF( mImage.width(), mImage.height() );
659 return QSizeF( 0, 0 );
665 return mIsMissingImage;
670 return mEvaluatedPath;
675 const QVariantMap parameters =
mCustomProperties.value( u
"svg-dynamic-parameters"_s, QVariantMap() ).toMap();
686void QgsLayoutItemPicture::shapeChanged()
698 const double oldRotation = mPictureRotation;
699 mPictureRotation = rotation;
700 const QSizeF currentPictureSize = pictureSize();
703 if ( !mLoaded || currentPictureSize == QSizeF( 0, 0 ) )
706 if ( mResizeMode ==
Zoom )
710 mPictureWidth = rotatedImageRect.width();
711 mPictureHeight = rotatedImageRect.height();
716 const QRectF oldRect = QRectF( pos().x(), pos().y(), rect().width(), rect().height() );
723 tr.rotate( mPictureRotation );
724 QRectF newRect = tr.mapRect( QRectF( 0, 0, rotatedImageRect.width(), rotatedImageRect.height() ) );
727 newRect.moveCenter( oldRect.center() );
737 mNorthArrowHandler->setLinkedMap( map );
775 mOriginalMode = format;
788 QString imagePath = mSourcePath;
792 if ( imagePath.endsWith(
".svg"_L1, Qt::CaseInsensitive ) )
795 imagePath = pathResolver.
writePath( imagePath );
797 elem.setAttribute( u
"file"_s, imagePath );
798 elem.setAttribute( u
"pictureWidth"_s, QString::number( mPictureWidth ) );
799 elem.setAttribute( u
"pictureHeight"_s, QString::number( mPictureHeight ) );
800 elem.setAttribute( u
"resizeMode"_s, QString::number(
static_cast< int >( mResizeMode ) ) );
801 elem.setAttribute( u
"anchorPoint"_s, QString::number(
static_cast< int >( mPictureAnchor ) ) );
804 elem.setAttribute( u
"svgBorderWidth"_s, QString::number( mSvgStrokeWidth ) );
805 elem.setAttribute( u
"mode"_s,
static_cast< int >( mOriginalMode ) );
808 elem.setAttribute( u
"pictureRotation"_s, QString::number( mPictureRotation ) );
809 if ( !mNorthArrowHandler->linkedMap() )
811 elem.setAttribute( u
"mapUuid"_s, QString() );
815 elem.setAttribute( u
"mapUuid"_s, mNorthArrowHandler->linkedMap()->uuid() );
817 elem.setAttribute( u
"northMode"_s, mNorthArrowHandler->northMode() );
818 elem.setAttribute( u
"northOffset"_s, mNorthArrowHandler->northOffset() );
823 elem.setAttribute( u
"clipToItem"_s, u
"1"_s );
827 elem.setAttribute( u
"clippingItem"_s, mClippingItem->uuid() );
835 mPictureWidth = itemElem.attribute( u
"pictureWidth"_s, u
"10"_s ).toDouble();
836 mPictureHeight = itemElem.attribute( u
"pictureHeight"_s, u
"10"_s ).toDouble();
843 mSvgStrokeWidth = itemElem.attribute( u
"svgBorderWidth"_s, u
"0.2"_s ).toDouble();
845 mMode = mOriginalMode;
847 const QDomNodeList composerItemList = itemElem.elementsByTagName( u
"ComposerItem"_s );
848 if ( !composerItemList.isEmpty() )
850 const QDomElement composerItemElem = composerItemList.at( 0 ).toElement();
852 if ( !
qgsDoubleNear( composerItemElem.attribute( u
"rotation"_s, u
"0"_s ).toDouble(), 0.0 ) )
855 mPictureRotation = composerItemElem.attribute( u
"rotation"_s, u
"0"_s ).toDouble();
859 mDefaultSvgSize = QSize( 0, 0 );
861 if ( itemElem.hasAttribute( u
"sourceExpression"_s ) )
864 const QString sourceExpression = itemElem.attribute( u
"sourceExpression"_s, QString() );
865 const QString useExpression = itemElem.attribute( u
"useExpression"_s );
866 bool expressionActive;
867 expressionActive = ( useExpression.compare(
"true"_L1, Qt::CaseInsensitive ) == 0 );
872 QString imagePath = itemElem.attribute( u
"file"_s );
876 if ( imagePath.endsWith(
".svg"_L1, Qt::CaseInsensitive ) )
879 imagePath = pathResolver.
readPath( imagePath );
881 mSourcePath = imagePath;
884 if ( !
qgsDoubleNear( itemElem.attribute( u
"pictureRotation"_s, u
"0"_s ).toDouble(), 0.0 ) )
886 mPictureRotation = itemElem.attribute( u
"pictureRotation"_s, u
"0"_s ).toDouble();
891 mNorthArrowHandler->setNorthOffset( itemElem.attribute( u
"northOffset"_s, u
"0"_s ).toDouble() );
893 mNorthArrowHandler->setLinkedMap(
nullptr );
894 mRotationMapUuid = itemElem.attribute( u
"mapUuid"_s );
896 mClipToItem = itemElem.attribute( u
"clipToItem"_s, u
"0"_s ).toInt();
897 mClippingItemUuid = itemElem.attribute( u
"clippingItem"_s );
904 return mNorthArrowHandler->linkedMap();
919 return mNorthArrowHandler->northOffset();
924 mNorthArrowHandler->setNorthOffset( offset );
929 mPictureAnchor = anchor;
935 mSvgFillColor = color;
941 mSvgStrokeColor = color;
947 mSvgStrokeWidth = width;
953 if ( mOriginalMode ==
mode )
956 mOriginalMode =
mode;
963 if ( !
mLayout || mRotationMapUuid.isEmpty() )
965 mNorthArrowHandler->setLinkedMap(
nullptr );
969 mNorthArrowHandler->setLinkedMap( qobject_cast< QgsLayoutItemMap * >(
mLayout->itemByUuid( mRotationMapUuid,
true ) ) );
972 if ( !mClippingItemUuid.isEmpty() )
1000 return mClippingItem;
1005 if ( mClippingItem == item )
1008 if ( mClippingItem )
1015 mClippingItem = item;
1017 if ( mClippingItem )
1022 mClippingItem->refresh();
@ Millimeters
Millimeters.
PictureFormat
Picture formats.
@ Unknown
Invalid or unknown image type.
@ Antialiasing
Use antialiasing when drawing items.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsFeature feature() const
Convenience function for retrieving the feature for the context, if set.
bool isValid() const
Returns the validity of this feature.
A geometry is the spatial representation of a feature.
QImage pathAsImage(const QString &path, const QSize size, const bool keepAspectRatio, const double opacity, bool &fitsInCache, bool blocking=false, double targetDpi=96, int frameNumber=-1, bool *isMissing=nullptr)
Returns the specified path rendered as an image.
void setResizeMode(QgsLayoutItemPicture::ResizeMode mode)
Sets the resize mode used for drawing the picture within the item bounds.
void setMode(Qgis::PictureFormat mode)
Sets the current picture mode (image format).
void setSvgDynamicParameters(const QMap< QString, QgsProperty > ¶meters)
Sets the SVG dynamic parameters.
QMap< QString, QgsProperty > svgDynamicParameters() const
Returns the SVG dynamic parameters.
QString picturePath() const
Returns the path of the source image.
void setPictureAnchor(QgsLayoutItem::ReferencePoint anchor)
Sets the picture's anchor point, which controls how it is placed within the picture item's frame.
void setNorthMode(NorthMode mode)
Sets the mode used to align the picture to a map's North.
double northOffset() const
Returns the offset added to the picture's rotation from a map's North.
QgsLayoutItemPicture(QgsLayout *layout)
Constructor for QgsLayoutItemPicture, with the specified parent layout.
void setLinkedMap(QgsLayoutItemMap *map)
Sets the map object for rotation.
void setPicturePath(const QString &path, Qgis::PictureFormat format=Qgis::PictureFormat::Unknown)
Sets the source path of the image (may be svg or a raster format).
QgsLayoutItem * clippingItem() const
Returns the item that will will provide the clipping path for the picture, or nullptr if no item is s...
void setPictureRotation(double rotation)
Sets the picture rotation within the item bounds, in degrees clockwise.
bool clipToItem() const
Returns true if the picture item should by clipped to the associated item.
bool isMissingImage() const
Returns true if the source image is missing and the picture cannot be rendered.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
QPainterPath framePath() const override
Returns the path to use when drawing the item's frame or background.
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
void setSvgStrokeWidth(double width)
Sets the stroke width (in layout units) used for parametrized SVG files.
QgsLayoutItemMap * linkedMap() const
Returns the linked rotation map, if set.
void pictureRotationChanged(double newRotation)
Emitted on picture rotation change.
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
static QgsLayoutItemPicture * create(QgsLayout *layout)
Returns a new picture item for the specified layout.
Qgis::PictureFormat mode() const
Returns the current picture mode (image format), FormatUnknown if given picture format is unknown.
NorthMode
Method for syncing rotation to a map's North direction.
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
QString evaluatedPath() const
Returns the current evaluated picture path, which includes the result of data defined path overrides.
QSizeF applyItemSizeConstraint(QSizeF targetSize) override
Applies any item-specific size constraint handling to a given targetSize in layout units.
void setClipToItem(bool clipToItem)
Sets whether the picture item should by clipped to the associated item.
void setSvgStrokeColor(const QColor &color)
Sets the stroke color used for parametrized SVG files.
int type() const override
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties) override
void setClippingItem(QgsLayoutItem *item)
Sets the item that will will provide the clipping path for the picture.
QIcon icon() const override
Returns the item's icon.
void refreshPicture(const QgsExpressionContext *context=nullptr)
Recalculates the source image (if using an expression for picture's source) and reloads and redraws t...
NorthMode northMode() const
Returns the mode used to align the picture to a map's North.
void setSvgFillColor(const QColor &color)
Sets the fill color used for parametrized SVG files.
void recalculateSize()
Forces a recalculation of the picture's frame size.
ResizeMode
Controls how pictures are scaled within the item's frame.
@ FrameToImageSize
Sets size of frame to match original size of image without scaling.
@ ZoomResizeFrame
Enlarges image to fit frame, then resizes frame to fit resultant image.
@ Clip
Draws image at original size and clips any portion which falls outside frame.
@ Stretch
Stretches image to fit frame, ignores aspect ratio.
@ Zoom
Enlarges image to fit frame while maintaining aspect ratio of picture.
void setNorthOffset(double offset)
Sets the offset added to the picture's rotation from a map's North.
@ LayoutPicture
Picture item.
Contains settings and helpers relating to a render of a QgsLayoutItem.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
virtual QPainterPath framePath() const
Returns the path to use when drawing the item's frame or background.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
QgsLayoutItem(QgsLayout *layout, bool manageZValue=true)
Constructor for QgsLayoutItem, with the specified parent layout.
void rotationChanged(double newRotation)
Emitted on item rotation change.
ReferencePoint
Fixed position reference point.
@ LowerMiddle
Lower center of item.
@ MiddleLeft
Middle left of item.
@ UpperRight
Upper right corner of item.
@ LowerLeft
Lower left corner of item.
@ UpperLeft
Upper left corner of item.
@ UpperMiddle
Upper center of item.
@ MiddleRight
Middle right of item.
@ LowerRight
Lower right corner of item.
friend class QgsLayoutItemMap
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void sizePositionChanged()
Emitted when the item's size or position changes.
void clipPathChanged()
Emitted when the item's clipping path has changed.
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
An object which handles north-arrow type behavior for layout items.
void arrowRotationChanged(double newRotation)
Emitted on arrow rotation change.
NorthMode
Method for syncing rotation to a map's North direction.
QgsObjectCustomProperties mCustomProperties
Custom properties for object.
QgsPropertyCollection mDataDefinedProperties
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ PictureSvgStrokeColor
SVG stroke color.
@ PictureSvgBackgroundColor
SVG background color.
@ PictureSource
Picture source url.
@ PictureSvgStrokeWidth
SVG stroke width.
@ AllProperties
All properties for item.
void dpiChanged()
Emitted when the context's DPI is changed.
void changed()
Emitted certain settings in the context is changed, e.g.
Provides a method of storing sizes, consisting of a width and height, for use in QGIS layouts.
double height() const
Returns the height of the size.
double width() const
Returns the width of the size.
static QRectF largestRotatedRectWithinBounds(const QRectF &originalRect, const QRectF &boundsRect, double rotation)
Calculates the largest scaled version of originalRect which fits within boundsRect,...
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
HTTP network content fetcher.
void fetchContent(const QUrl &url, const QString &authcfg=QString(), const QgsHttpHeaders &headers=QgsHttpHeaders())
Fetches content from a remote URL and handles redirects.
void finished()
Emitted when content has loaded.
QNetworkReply * reply()
Returns a reference to the network reply.
Resolves relative paths into absolute paths and vice versa.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
A store for object properties.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
static QVariantMap propertyMapToVariantMap(const QMap< QString, QgsProperty > &propertyMap)
Convert a map of QgsProperty to a map of QVariant This is useful to save a map of properties.
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static QMap< QString, QgsProperty > variantMapToPropertyMap(const QVariantMap &variantMap)
Convert a map of QVariant to a map of QgsProperty This is useful to restore a map of properties.
A container for the context for various read/write operations on objects.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
Scoped object for saving and restoring a QPainter object's state.
QByteArray svgContent(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >(), bool *isMissingImage=nullptr)
Gets the SVG content corresponding to the given path.
static QgsStringMap evaluatePropertiesMap(const QMap< QString, QgsProperty > &propertiesMap, const QgsExpressionContext &context)
Evaluates a map of properties using the given context and returns a variant map with evaluated expres...
static QString svgSymbolPathToName(const QString &path, const QgsPathResolver &pathResolver)
Determines an SVG symbol's name from its path.
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QMap< QString, QString > QgsStringMap
#define QgsDebugMsgLevel(str, level)