QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
qgslayoutitemlabel.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayoutitemlabel.cpp
3 -------------------
4 begin : October 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgslayoutitemlabel.h"
19#include "moc_qgslayoutitemlabel.cpp"
21#include "qgslayoututils.h"
22#include "qgslayoutmodel.h"
23#include "qgsexpression.h"
24#include "qgsvectorlayer.h"
25#include "qgsdistancearea.h"
26#include "qgsfontutils.h"
27#include "qgstextformat.h"
28#include "qgstextrenderer.h"
30#include "qgslayoutitemmap.h"
31#include "qgssettings.h"
32#include "qgslayout.h"
35
36#include <QCoreApplication>
37#include <QDate>
38#include <QDomElement>
39#include <QPainter>
40#include <QTextDocument>
41
43 : QgsLayoutItem( layout )
44{
45 mDistanceArea.reset( new QgsDistanceArea() );
46 mHtmlUnitsToLayoutUnits = htmlUnitsToLayoutUnits();
47
48 //get default layout font from settings
49 const QgsSettings settings;
50 const QString defaultFontString = settings.value( QStringLiteral( "LayoutDesigner/defaultFont" ), QVariant(), QgsSettings::Gui ).toString();
51 if ( !defaultFontString.isEmpty() )
52 {
53 QFont f = mFormat.font();
54 QgsFontUtils::setFontFamily( f, defaultFontString );
55 mFormat.setFont( f );
56 }
57
58 //default to a 10 point font size
59 mFormat.setSize( 10 );
61
62 connect( this, &QgsLayoutItem::sizePositionChanged, this, [this]
63 {
64 updateBoundingRect();
65 } );
66
67 //default to no background
68 setBackgroundEnabled( false );
69
70 //a label added while atlas preview is enabled needs to have the expression context set,
71 //otherwise fields in the label aren't correctly evaluated until atlas preview feature changes (#9457)
72 refreshExpressionContext();
73}
74
79
84
86{
87 return QgsApplication::getThemeIcon( QStringLiteral( "/mLayoutItemLabel.svg" ) );
88}
89
91{
92 QPainter *painter = context.renderContext().painter();
93 const QgsScopedQPainterState painterState( painter );
94
95 const double penWidth = frameEnabled() ? ( pen().widthF() / 2.0 ) : 0;
96 const double xPenAdjust = mMarginX < 0 ? -penWidth : penWidth;
97 const double yPenAdjust = mMarginY < 0 ? -penWidth : penWidth;
98
99 QRectF painterRect;
100 if ( mMode == QgsLayoutItemLabel::ModeFont )
101 {
102 const double rectScale = context.renderContext().scaleFactor();
103 painterRect = QRectF( ( xPenAdjust + mMarginX ) * rectScale,
104 ( yPenAdjust + mMarginY ) * rectScale,
105 ( rect().width() - 2 * xPenAdjust - 2 * mMarginX ) * rectScale,
106 ( rect().height() - 2 * yPenAdjust - 2 * mMarginY ) * rectScale );
107 }
108 else
109 {
110 // The 3.77 adjustment value was found through trial and error, the author has however no clue as to where it comes from
111 const double adjustmentFactor = 3.77;
112 const double rectScale = context.renderContext().scaleFactor() * adjustmentFactor;
113 // The left/right margin is handled by the stylesheet while the top/bottom margin is ignored by QTextDocument
114 painterRect = QRectF( 0, 0,
115 ( rect().width() ) * rectScale,
116 ( rect().height() - yPenAdjust - mMarginY ) * rectScale );
117 painter->translate( 0, ( yPenAdjust + mMarginY ) * context.renderContext().scaleFactor() );
118 painter->scale( context.renderContext().scaleFactor() / adjustmentFactor, context.renderContext().scaleFactor() / adjustmentFactor );
119 }
120
121 switch ( mMode )
122 {
123 case ModeHtml:
124 {
125 QTextDocument document;
126 document.setDocumentMargin( 0 );
127 document.setPageSize( QSizeF( painterRect.width() / context.renderContext().scaleFactor(), painterRect.height() / context.renderContext().scaleFactor() ) );
128 document.setDefaultStyleSheet( createStylesheet() );
129
130 document.setDefaultFont( createDefaultFont() );
131
132 QTextOption textOption = document.defaultTextOption();
133 textOption.setAlignment( mHAlignment );
134 document.setDefaultTextOption( textOption );
135
136 document.setHtml( QStringLiteral( "<body>%1</body>" ).arg( currentText() ) );
137 document.drawContents( painter, painterRect );
138 break;
139 }
140
141 case ModeFont:
142 {
144 QgsTextRenderer::drawText( painterRect, 0,
146 currentText().split( '\n' ),
147 context.renderContext(),
148 mFormat,
149 true,
152 break;
153 }
154 }
155}
156
157void QgsLayoutItemLabel::contentChanged()
158{
159 switch ( mMode )
160 {
161 case ModeHtml:
162 {
164 break;
165 }
166 case ModeFont:
168 break;
169 }
170}
171
172void QgsLayoutItemLabel::setText( const QString &text )
173{
174 mText = text;
175 emit changed();
176
177 contentChanged();
178
179 if ( mLayout && id().isEmpty() && mMode != ModeHtml )
180 {
181 //notify the model that the display name has changed
182 mLayout->itemsModel()->updateItemDisplayName( this );
183 }
184}
185
187{
188 if ( mode == mMode )
189 {
190 return;
191 }
192
193 mMode = mode;
194 contentChanged();
195
196 if ( mLayout && id().isEmpty() )
197 {
198 //notify the model that the display name has changed
199 mLayout->itemsModel()->updateItemDisplayName( this );
200 }
201}
202
203void QgsLayoutItemLabel::refreshExpressionContext()
204{
205 if ( !mLayout )
206 return;
207
208 QgsVectorLayer *layer = mLayout->reportContext().layer();
209 //setup distance area conversion
210 if ( layer )
211 {
212 mDistanceArea->setSourceCrs( layer->crs(), mLayout->project()->transformContext() );
213 }
214 else
215 {
216 //set to composition's reference map's crs
217 QgsLayoutItemMap *referenceMap = mLayout->referenceMap();
218 if ( referenceMap )
219 mDistanceArea->setSourceCrs( referenceMap->crs(), mLayout->project()->transformContext() );
220 }
221 mDistanceArea->setEllipsoid( mLayout->project()->ellipsoid() );
222 contentChanged();
223
224 update();
225}
226
227void QgsLayoutItemLabel::updateBoundingRect()
228{
229 QRectF rectangle = rect();
230 const double frameExtension = frameEnabled() ? pen().widthF() / 2.0 : 0.0;
231 if ( frameExtension > 0 )
232 rectangle.adjust( -frameExtension, -frameExtension, frameExtension, frameExtension );
233
234 if ( mMarginX < 0 )
235 {
236 rectangle.adjust( mMarginX, 0, -mMarginX, 0 );
237 }
238 if ( mMarginY < 0 )
239 {
240 rectangle.adjust( 0, mMarginY, 0, -mMarginY );
241 }
242
243 if ( rectangle != mCurrentRectangle )
244 {
245 prepareGeometryChange();
246 mCurrentRectangle = rectangle;
247 }
249}
250
252{
253 QString displayText = mText;
254 replaceDateText( displayText );
255
257
258 return QgsExpression::replaceExpressionText( displayText, &context, mDistanceArea.get() );
259}
260
261void QgsLayoutItemLabel::replaceDateText( QString &text ) const
262{
263 const QString constant = QStringLiteral( "$CURRENT_DATE" );
264 const int currentDatePos = text.indexOf( constant );
265 if ( currentDatePos != -1 )
266 {
267 //check if there is a bracket just after $CURRENT_DATE
268 QString formatText;
269 const int openingBracketPos = text.indexOf( '(', currentDatePos );
270 const int closingBracketPos = text.indexOf( ')', openingBracketPos + 1 );
271 if ( openingBracketPos != -1 &&
272 closingBracketPos != -1 &&
273 ( closingBracketPos - openingBracketPos ) > 1 &&
274 openingBracketPos == currentDatePos + constant.size() )
275 {
276 formatText = text.mid( openingBracketPos + 1, closingBracketPos - openingBracketPos - 1 );
277 text.replace( currentDatePos, closingBracketPos - currentDatePos + 1, QDate::currentDate().toString( formatText ) );
278 }
279 else //no bracket
280 {
281 text.replace( QLatin1String( "$CURRENT_DATE" ), QDate::currentDate().toString() );
282 }
283 }
284}
285
286void QgsLayoutItemLabel::setFont( const QFont &f )
287{
288 mFormat.setFont( f );
289 if ( f.pointSizeF() > 0 )
290 mFormat.setSize( f.pointSizeF() );
292}
293
295{
296 return mFormat;
297}
298
300{
301 mFormat = format;
303}
304
305void QgsLayoutItemLabel::setMargin( const double m )
306{
307 mMarginX = m;
308 mMarginY = m;
309 updateBoundingRect();
310}
311
312void QgsLayoutItemLabel::setMarginX( const double margin )
313{
314 mMarginX = margin;
315 updateBoundingRect();
316}
317
318void QgsLayoutItemLabel::setMarginY( const double margin )
319{
320 mMarginY = margin;
321 updateBoundingRect();
322}
323
325{
326 const QSizeF newSize = sizeForText();
327
328 //keep alignment point constant
329 double xShift = 0;
330 double yShift = 0;
331
332 itemShiftAdjustSize( newSize.width(), newSize.height(), xShift, yShift );
333
334 //update rect for data defined size and position
335 attemptSetSceneRect( QRectF( pos().x() + xShift, pos().y() + yShift, newSize.width(), newSize.height() ) );
336}
337
339{
340 const QSizeF newSize = sizeForText();
341 const double newWidth = newSize.width();
342 const double newHeight = newSize.height();
343 const double currentWidth = rect().width();
344 const double currentHeight = rect().height();
345
346 //keep reference point constant
347 double xShift = 0;
348 double yShift = 0;
349 switch ( referencePoint )
350 {
352 xShift = 0;
353 yShift = 0;
354 break;
356 xShift = - ( newWidth - currentWidth ) / 2.0;
357 yShift = 0;
358 break;
359
361 xShift = - ( newWidth - currentWidth );
362 yShift = 0;
363 break;
364
366 xShift = 0;
367 yShift = -( newHeight - currentHeight ) / 2.0;
368 break;
369
371 xShift = - ( newWidth - currentWidth ) / 2.0;
372 yShift = -( newHeight - currentHeight ) / 2.0;
373 break;
374
376 xShift = - ( newWidth - currentWidth );
377 yShift = -( newHeight - currentHeight ) / 2.0;
378 break;
379
381 xShift = 0;
382 yShift = - ( newHeight - currentHeight );
383 break;
384
386 xShift = - ( newWidth - currentWidth ) / 2.0;
387 yShift = - ( newHeight - currentHeight );
388 break;
389
391 xShift = - ( newWidth - currentWidth );
392 yShift = - ( newHeight - currentHeight );
393 break;
394 }
395
396 //update rect for data defined size and position
397 attemptSetSceneRect( QRectF( pos().x() + xShift, pos().y() + yShift, newSize.width(), newSize.height() ) );
398}
399
401{
404
405 const QStringList lines = currentText().split( '\n' );
406 const double textWidth = std::ceil( QgsTextRenderer::textWidth( context, mFormat, lines ) + 1 ) / context.convertToPainterUnits( 1, Qgis::RenderUnit::Millimeters );
407 const double fontHeight = std::ceil( QgsTextRenderer::textHeight( context, mFormat, lines ) + 1 ) / context.convertToPainterUnits( 1, Qgis::RenderUnit::Millimeters );
408
409 const double penWidth = frameEnabled() ? ( pen().widthF() / 2.0 ) : 0;
410
411 const double width = textWidth + 2 * mMarginX + 2 * penWidth;
412 const double height = fontHeight + 2 * mMarginY + 2 * penWidth;
413
414 return mLayout->convertToLayoutUnits( QgsLayoutSize( width, height, Qgis::LayoutUnit::Millimeters ) );
415}
416
418{
419 return mFormat.font();
420}
421
422bool QgsLayoutItemLabel::writePropertiesToElement( QDomElement &layoutLabelElem, QDomDocument &doc, const QgsReadWriteContext &rwContext ) const
423{
424 layoutLabelElem.setAttribute( QStringLiteral( "htmlState" ), static_cast< int >( mMode ) );
425
426 layoutLabelElem.setAttribute( QStringLiteral( "labelText" ), mText );
427 layoutLabelElem.setAttribute( QStringLiteral( "marginX" ), QString::number( mMarginX ) );
428 layoutLabelElem.setAttribute( QStringLiteral( "marginY" ), QString::number( mMarginY ) );
429 layoutLabelElem.setAttribute( QStringLiteral( "halign" ), mHAlignment );
430 layoutLabelElem.setAttribute( QStringLiteral( "valign" ), mVAlignment );
431
432 QDomElement textElem = mFormat.writeXml( doc, rwContext );
433 layoutLabelElem.appendChild( textElem );
434
435 return true;
436}
437
438bool QgsLayoutItemLabel::readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &, const QgsReadWriteContext &context )
439{
440 //restore label specific properties
441
442 //text
443 mText = itemElem.attribute( QStringLiteral( "labelText" ) );
444
445 //html state
446 mMode = static_cast< Mode >( itemElem.attribute( QStringLiteral( "htmlState" ) ).toInt() );
447
448 //margin
449 bool marginXOk = false;
450 bool marginYOk = false;
451 mMarginX = itemElem.attribute( QStringLiteral( "marginX" ) ).toDouble( &marginXOk );
452 mMarginY = itemElem.attribute( QStringLiteral( "marginY" ) ).toDouble( &marginYOk );
453 if ( !marginXOk || !marginYOk )
454 {
455 //upgrade old projects where margins where stored in a single attribute
456 const double margin = itemElem.attribute( QStringLiteral( "margin" ), QStringLiteral( "1.0" ) ).toDouble();
457 mMarginX = margin;
458 mMarginY = margin;
459 }
460
461 //Horizontal alignment
462 mHAlignment = static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral( "halign" ) ).toInt() );
463
464 //Vertical alignment
465 mVAlignment = static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral( "valign" ) ).toInt() );
466
467 //font
468 QDomNodeList textFormatNodeList = itemElem.elementsByTagName( QStringLiteral( "text-style" ) );
469 if ( !textFormatNodeList.isEmpty() )
470 {
471 QDomElement textFormatElem = textFormatNodeList.at( 0 ).toElement();
472 mFormat.readXml( textFormatElem, context );
473 }
474 else
475 {
476 QFont f;
477 if ( !QgsFontUtils::setFromXmlChildNode( f, itemElem, QStringLiteral( "LabelFont" ) ) )
478 {
479 f.fromString( itemElem.attribute( QStringLiteral( "font" ), QString() ) );
480 }
481 mFormat.setFont( f );
482 if ( f.pointSizeF() > 0 )
483 {
484 mFormat.setSize( f.pointSizeF() );
486 }
487 else if ( f.pixelSize() > 0 )
488 {
489 mFormat.setSize( f.pixelSize() );
491 }
492
493 //font color
494 const QDomNodeList fontColorList = itemElem.elementsByTagName( QStringLiteral( "FontColor" ) );
495 if ( !fontColorList.isEmpty() )
496 {
497 const QDomElement fontColorElem = fontColorList.at( 0 ).toElement();
498 const int red = fontColorElem.attribute( QStringLiteral( "red" ), QStringLiteral( "0" ) ).toInt();
499 const int green = fontColorElem.attribute( QStringLiteral( "green" ), QStringLiteral( "0" ) ).toInt();
500 const int blue = fontColorElem.attribute( QStringLiteral( "blue" ), QStringLiteral( "0" ) ).toInt();
501 const int alpha = fontColorElem.attribute( QStringLiteral( "alpha" ), QStringLiteral( "255" ) ).toInt();
502 mFormat.setColor( QColor( red, green, blue, alpha ) );
503 }
504 else if ( textFormatNodeList.isEmpty() )
505 {
506 mFormat.setColor( QColor( 0, 0, 0 ) );
507 }
508 }
509
510 updateBoundingRect();
511
512 return true;
513}
514
516{
517 if ( !id().isEmpty() )
518 {
519 return id();
520 }
521
522 switch ( mMode )
523 {
524 case ModeHtml:
525 return tr( "<HTML Label>" );
526
527 case ModeFont:
528 {
529
530 //if no id, default to portion of label text
531 const QString text = mText;
532 if ( text.isEmpty() )
533 {
534 return tr( "<Label>" );
535 }
536 if ( text.length() > 25 )
537 {
538 return QString( tr( "%1…" ) ).arg( text.left( 25 ).simplified() );
539 }
540 else
541 {
542 return text.simplified();
543 }
544 }
545 }
546 return QString(); // no warnings
547}
548
550{
551 return mCurrentRectangle;
552}
553
555{
557 updateBoundingRect();
558}
559
561{
563 updateBoundingRect();
564}
565
567{
570 refreshExpressionContext();
571}
572
574{
575 const QString evaluated = currentText();
576 if ( evaluated == mText )
577 return; // no changes
578
579 setText( evaluated );
580}
581
582void QgsLayoutItemLabel::itemShiftAdjustSize( double newWidth, double newHeight, double &xShift, double &yShift ) const
583{
584 //keep alignment point constant
585 const double currentWidth = rect().width();
586 const double currentHeight = rect().height();
587 xShift = 0;
588 yShift = 0;
589
590 const double r = rotation();
591 if ( r >= 0 && r < 90 )
592 {
593 if ( mHAlignment == Qt::AlignHCenter )
594 {
595 xShift = - ( newWidth - currentWidth ) / 2.0;
596 }
597 else if ( mHAlignment == Qt::AlignRight )
598 {
599 xShift = - ( newWidth - currentWidth );
600 }
601 if ( mVAlignment == Qt::AlignVCenter )
602 {
603 yShift = -( newHeight - currentHeight ) / 2.0;
604 }
605 else if ( mVAlignment == Qt::AlignBottom )
606 {
607 yShift = - ( newHeight - currentHeight );
608 }
609 }
610 if ( r >= 90 && r < 180 )
611 {
612 if ( mHAlignment == Qt::AlignHCenter )
613 {
614 yShift = -( newHeight - currentHeight ) / 2.0;
615 }
616 else if ( mHAlignment == Qt::AlignRight )
617 {
618 yShift = -( newHeight - currentHeight );
619 }
620 if ( mVAlignment == Qt::AlignTop )
621 {
622 xShift = -( newWidth - currentWidth );
623 }
624 else if ( mVAlignment == Qt::AlignVCenter )
625 {
626 xShift = -( newWidth - currentWidth / 2.0 );
627 }
628 }
629 else if ( r >= 180 && r < 270 )
630 {
631 if ( mHAlignment == Qt::AlignHCenter )
632 {
633 xShift = -( newWidth - currentWidth ) / 2.0;
634 }
635 else if ( mHAlignment == Qt::AlignLeft )
636 {
637 xShift = -( newWidth - currentWidth );
638 }
639 if ( mVAlignment == Qt::AlignVCenter )
640 {
641 yShift = ( newHeight - currentHeight ) / 2.0;
642 }
643 else if ( mVAlignment == Qt::AlignTop )
644 {
645 yShift = ( newHeight - currentHeight );
646 }
647 }
648 else if ( r >= 270 && r < 360 )
649 {
650 if ( mHAlignment == Qt::AlignHCenter )
651 {
652 yShift = -( newHeight - currentHeight ) / 2.0;
653 }
654 else if ( mHAlignment == Qt::AlignLeft )
655 {
656 yShift = -( newHeight - currentHeight );
657 }
658 if ( mVAlignment == Qt::AlignBottom )
659 {
660 xShift = -( newWidth - currentWidth );
661 }
662 else if ( mVAlignment == Qt::AlignVCenter )
663 {
664 xShift = -( newWidth - currentWidth / 2.0 );
665 }
666 }
667}
668
669QFont QgsLayoutItemLabel::createDefaultFont() const
670{
671 QFont f = mFormat.font();
672 switch ( mFormat.sizeUnit() )
673 {
675 f.setPointSizeF( mFormat.size() / 0.352778 );
676 break;
678 f.setPixelSize( mFormat.size() );
679 break;
681 f.setPointSizeF( mFormat.size() );
682 break;
684 f.setPointSizeF( mFormat.size() * 72 );
685 break;
690 break;
691 }
692 return f;
693}
694
695double QgsLayoutItemLabel::htmlUnitsToLayoutUnits()
696{
697 if ( !mLayout )
698 {
699 return 1.0;
700 }
701
702 //TODO : fix this more precisely so that the label's default text size is the same with or without "display as html"
703 return mLayout->convertToLayoutUnits( QgsLayoutMeasurement( mLayout->renderContext().dpi() / 72.0, Qgis::LayoutUnit::Millimeters ) ); //webkit seems to assume a standard dpi of 72
704}
705
706QString QgsLayoutItemLabel::createStylesheet() const
707{
708 QString stylesheet;
709
710 stylesheet += QStringLiteral( "body { margin: %1 %2;" ).arg( std::max( mMarginY * mHtmlUnitsToLayoutUnits, 0.0 ) ).arg( std::max( mMarginX * mHtmlUnitsToLayoutUnits, 0.0 ) );
711 stylesheet += mFormat.asCSS( 0.352778 * mHtmlUnitsToLayoutUnits );
712 stylesheet += QStringLiteral( "text-align: %1; }" ).arg( mHAlignment == Qt::AlignLeft ? QStringLiteral( "left" ) : mHAlignment == Qt::AlignRight ? QStringLiteral( "right" ) : mHAlignment == Qt::AlignHCenter ? QStringLiteral( "center" ) : QStringLiteral( "justify" ) );
713
714 return stylesheet;
715}
716
717QUrl QgsLayoutItemLabel::createStylesheetUrl() const
718{
719 QByteArray ba;
720 ba.append( createStylesheet().toUtf8() );
721 QUrl cssFileURL = QUrl( QString( "data:text/css;charset=utf-8;base64," + ba.toBase64() ) );
722
723 return cssFileURL;
724}
@ Millimeters
Millimeters.
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size)
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes)
@ Unknown
Mixed or unknown units.
@ MapUnits
Map units.
@ MetersInMapUnits
Meters value as Map units.
@ ApplyScalingWorkaroundForTextRendering
Whether a scaling workaround designed to stablise the rendering of small font sizes (or for painters ...
@ WrapLines
Automatically wrap long lines of text.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
static bool setFromXmlChildNode(QFont &font, const QDomElement &element, const QString &childNode)
Sets the properties of a font to match the properties stored in an XML child node.
static void setFontFamily(QFont &font, const QString &family)
Sets the family for a font object.
A layout item subclass for text labels.
Mode mode() const
Returns the label's current mode.
void setMarginX(double margin)
Sets the horizontal margin between the edge of the frame and the label contents, in layout units.
void setFrameEnabled(bool drawFrame) override
Sets whether this item has a frame drawn around it or not.
QRectF boundingRect() const override
QSizeF sizeForText() const
Returns the required item size (in layout units) for the label's text to fill the item.
void setMargin(double margin)
Sets the margin between the edge of the frame and the label contents.
int type() const override
static QgsLayoutItemLabel * create(QgsLayout *layout)
Returns a new label item for the specified layout.
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
Q_DECL_DEPRECATED QFont font() const
Returns the label's current font.
QgsLayoutItemLabel(QgsLayout *layout)
Constructor for QgsLayoutItemLabel, with the specified parent layout.
void setText(const QString &text)
Sets the label's preset text.
void setFrameStrokeWidth(QgsLayoutMeasurement strokeWidth) override
Sets the frame stroke width.
void setMarginY(double margin)
Sets the vertical margin between the edge of the frame and the label contents, in layout units.
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
Q_DECL_DEPRECATED void setFont(const QFont &font)
Sets the label's current font.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
void setMode(Mode mode)
Sets the label's current mode, allowing the label to switch between font based and HTML based renderi...
QString displayName() const override
Gets item display name.
QString text() const
Returns the label's preset text.
void convertToStaticText()
Converts the label's text() to a static string, by evaluating any expressions included in the text an...
QgsTextFormat textFormat() const
Returns the text format used for drawing text in the label.
void setTextFormat(const QgsTextFormat &format)
Sets the text format used for drawing text in the label.
QString currentText() const
Returns the text as it appears on the label (with evaluated expressions and other dynamic content).
QIcon icon() const override
Returns the item's icon.
void adjustSizeToText()
Resizes the item so that the label's text fits to the item.
@ ModeHtml
Label displays rendered HTML content.
@ ModeFont
Label displays text rendered using a single font.
Layout graphical items for displaying a map.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
Contains settings and helpers relating to a render of a QgsLayoutItem.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Base class for graphical items within a QgsLayout.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
ReferencePoint referencePoint() const
Returns the reference point for positioning of the layout item.
ReferencePoint
Fixed position reference point.
@ LowerMiddle
Lower center of item.
@ MiddleLeft
Middle left of item.
@ Middle
Center 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.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void setFrameEnabled(bool drawFrame)
Sets whether this item has a frame drawn around it or not.
void sizePositionChanged()
Emitted when the item's size or position changes.
virtual void invalidateCache()
Forces a deferred update of any cached image the item uses.
QString id() const
Returns the item's ID name.
bool frameEnabled() const
Returns true if the item includes a frame.
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.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
QPointer< QgsLayout > mLayout
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition qgslayout.h:49
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:83
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
Scoped object for saving and restoring a QPainter object's state.
This class is a composition of two QSettings instances:
Definition qgssettings.h:64
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setSize(double size)
Sets the size for rendered text.
void setFont(const QFont &font)
Sets the font used for rendering text.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
Qgis::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
double size() const
Returns the size for rendered text.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
QString asCSS(double pointToPixelMultiplier=1.0) const
Returns a CSS string representing the specified text format as closely as possible.
QFont font() const
Returns the font used for rendering text.
static Qgis::TextVerticalAlignment convertQtVAlignment(Qt::Alignment alignment)
Converts a Qt vertical alignment flag to a Qgis::TextVerticalAlignment value.
static double textWidth(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF *fontMetrics=nullptr)
Returns the width of a text based on a given format.
static void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
static Qgis::TextHorizontalAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a Qgis::TextHorizontalAlignment value.
Represents a vector layer which manages a vector based data sets.