QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgslayoutlabelwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutlabelwidget.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 "qgslayoutlabelwidget.h"
19 #include "qgslayoutitemlabel.h"
20 #include "qgslayout.h"
22 #include "qgsguiutils.h"
23 #include "qgslayoutitemmap.h"
24 #include "qgsvectorlayer.h"
25 
26 #include <QColorDialog>
27 #include <QFontDialog>
28 #include <QWidget>
29 #include <QAction>
30 #include <QMenu>
31 
33  : QgsLayoutItemBaseWidget( nullptr, label )
34  , mLabel( label )
35 {
36  Q_ASSERT( mLabel );
37 
38  setupUi( this );
39  connect( mHtmlCheckBox, &QCheckBox::stateChanged, this, &QgsLayoutLabelWidget::mHtmlCheckBox_stateChanged );
40  connect( mTextEdit, &QPlainTextEdit::textChanged, this, &QgsLayoutLabelWidget::mTextEdit_textChanged );
41  connect( mInsertExpressionButton, &QPushButton::clicked, this, &QgsLayoutLabelWidget::mInsertExpressionButton_clicked );
42  connect( mMarginXDoubleSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLabelWidget::mMarginXDoubleSpinBox_valueChanged );
43  connect( mMarginYDoubleSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLabelWidget::mMarginYDoubleSpinBox_valueChanged );
44  connect( mFontColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutLabelWidget::mFontColorButton_colorChanged );
45  connect( mCenterRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::mCenterRadioButton_clicked );
46  connect( mLeftRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::mLeftRadioButton_clicked );
47  connect( mRightRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::mRightRadioButton_clicked );
48  connect( mTopRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::mTopRadioButton_clicked );
49  connect( mBottomRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::mBottomRadioButton_clicked );
50  connect( mMiddleRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::mMiddleRadioButton_clicked );
51  setPanelTitle( tr( "Label Properties" ) );
52 
53  mFontButton->setMode( QgsFontButton::ModeQFont );
54 
55  //add widget for general composer item properties
56  mItemPropertiesWidget = new QgsLayoutItemPropertiesWidget( this, label );
57  mainLayout->addWidget( mItemPropertiesWidget );
58 
59  mFontColorButton->setColorDialogTitle( tr( "Select Font Color" ) );
60  mFontColorButton->setContext( QStringLiteral( "composer" ) );
61  mFontColorButton->setAllowOpacity( true );
62 
63  mMarginXDoubleSpinBox->setClearValue( 0.0 );
64  mMarginYDoubleSpinBox->setClearValue( 0.0 );
65 
66  setGuiElementValues();
67  connect( mLabel, &QgsLayoutObject::changed, this, &QgsLayoutLabelWidget::setGuiElementValues );
68 
69  connect( mFontButton, &QgsFontButton::changed, this, &QgsLayoutLabelWidget::fontChanged );
70  connect( mJustifyRadioButton, &QRadioButton::clicked, this, &QgsLayoutLabelWidget::justifyClicked );
71 
72  mDynamicTextMenu = new QMenu( this );
73  mDynamicTextButton->setMenu( mDynamicTextMenu );
74 
75  connect( mDynamicTextMenu, &QMenu::aboutToShow, this, [ = ]
76  {
77  mDynamicTextMenu->clear();
78  // we need to rebuild this on each show, as the content varies depending on other available items...
79  buildInsertDynamicTextMenu( mLabel->layout(), mDynamicTextMenu, [ = ]( const QString & expression )
80  {
81  mLabel->beginCommand( tr( "Insert dynamic text" ) );
82  mTextEdit->insertPlainText( "[%" + expression + "%]" );
83  mLabel->endCommand();
84  } );
85  } );
86 
87 }
88 
90 {
91  if ( mItemPropertiesWidget )
92  mItemPropertiesWidget->setMasterLayout( masterLayout );
93 }
94 
95 void QgsLayoutLabelWidget::buildInsertDynamicTextMenu( QgsLayout *layout, QMenu *menu, const std::function<void ( const QString & )> &callback )
96 {
97  auto addExpression = [&callback]( QMenu * menu, const QString & name, const QString & expression )
98  {
99  QAction *action = new QAction( name, menu );
100  connect( action, &QAction::triggered, action, [callback, expression]
101  {
102  callback( expression );
103  } );
104  menu->addAction( action );
105  };
106 
107  QMenu *dateMenu = new QMenu( tr( "Current Date" ), menu );
108  for ( const std::pair< QString, QString > &expression :
109  {
110  std::make_pair( tr( "ISO Format (%1)" ).arg( QDateTime::currentDateTime().toString( QStringLiteral( "yyyy-MM-dd" ) ) ), QStringLiteral( "format_date(now(), 'yyyy-MM-dd')" ) ),
111  std::make_pair( tr( "Day/Month/Year (%1)" ).arg( QDateTime::currentDateTime().toString( QStringLiteral( "dd/MM/yyyy" ) ) ), QStringLiteral( "format_date(now(), 'dd/MM/yyyy')" ) ),
112  std::make_pair( tr( "Month/Day/Year (%1)" ).arg( QDateTime::currentDateTime().toString( QStringLiteral( "MM/dd/yyyy" ) ) ), QStringLiteral( "format_date(now(), 'MM/dd/yyyy')" ) ),
113  } )
114  {
115  addExpression( dateMenu, expression.first, expression.second );
116  }
117  menu->addMenu( dateMenu );
118 
119  QMenu *mapsMenu = new QMenu( tr( "Map Properties" ), menu );
120  QList< QgsLayoutItemMap * > maps;
121  layout->layoutItems( maps );
122  for ( QgsLayoutItemMap *map : qgis::as_const( maps ) )
123  {
124  // these expressions require the map to have a non-empty ID set
125  if ( map->id().isEmpty() )
126  continue;
127 
128  QMenu *mapMenu = new QMenu( map->displayName(), mapsMenu );
129  for ( const std::pair< QString, QString > &expression :
130  {
131  std::make_pair( tr( "Scale (%1)" ).arg( map->scale() ), QStringLiteral( "item_variables('%1')['map_scale']" ).arg( map->id() ) ),
132  std::make_pair( tr( "Rotation (%1)" ).arg( map->rotation() ), QStringLiteral( "item_variables('%1')['map_rotation']" ).arg( map->id() ) ),
133  } )
134  {
135  addExpression( mapMenu, expression.first, expression.second );
136  }
137  mapMenu->addSeparator();
138  for ( const std::pair< QString, QString > &expression :
139  {
140  std::make_pair( tr( "CRS Identifier (%1)" ).arg( map->crs().authid() ), QStringLiteral( "item_variables('%1')['map_crs']" ).arg( map->id() ) ),
141  std::make_pair( tr( "CRS Name (%1)" ).arg( map->crs().description() ), QStringLiteral( "item_variables('%1')['map_crs_description']" ).arg( map->id() ) ),
142  std::make_pair( tr( "Ellipsoid Name (%1)" ).arg( map->crs().ellipsoidAcronym() ), QStringLiteral( "item_variables('%1')['map_crs_ellipsoid']" ).arg( map->id() ) ),
143  std::make_pair( tr( "Units (%1)" ).arg( QgsUnitTypes::toString( map->crs().mapUnits() ) ), QStringLiteral( "item_variables('%1')['map_units']" ).arg( map->id() ) ),
144  } )
145  {
146  addExpression( mapMenu, expression.first, expression.second );
147  }
148  mapMenu->addSeparator();
149 
150  const QgsRectangle mapExtent = map->extent();
151  const QgsPointXY center = mapExtent.center();
152  for ( const std::pair< QString, QString > &expression :
153  {
154  std::make_pair( tr( "Center (X) (%1)" ).arg( center.x() ), QStringLiteral( "x(item_variables('%1')['map_extent_center'])" ).arg( map->id() ) ),
155  std::make_pair( tr( "Center (Y) (%1)" ).arg( center.y() ), QStringLiteral( "y(item_variables('%1')['map_extent_center'])" ).arg( map->id() ) ),
156  std::make_pair( tr( "X Minimum (%1)" ).arg( mapExtent.xMinimum() ), QStringLiteral( "x_min(item_variables('%1')['map_extent'])" ).arg( map->id() ) ),
157  std::make_pair( tr( "Y Minimum (%1)" ).arg( mapExtent.yMinimum() ), QStringLiteral( "y_min(item_variables('%1')['map_extent'])" ).arg( map->id() ) ),
158  std::make_pair( tr( "X Maximum (%1)" ).arg( mapExtent.xMaximum() ), QStringLiteral( "x_max(item_variables('%1')['map_extent'])" ).arg( map->id() ) ),
159  std::make_pair( tr( "Y Maximum (%1)" ).arg( mapExtent.yMaximum() ), QStringLiteral( "y_max(item_variables('%1')['map_extent'])" ).arg( map->id() ) ),
160  } )
161  {
162  addExpression( mapMenu, expression.first, expression.second );
163  }
164  mapMenu->addSeparator();
165  for ( const std::pair< QString, QString > &expression :
166  {
167  std::make_pair( tr( "Layer Credits" ), QStringLiteral( "array_to_string(map_credits('%1'))" ).arg( map->id() ) ),
168  } )
169  {
170  addExpression( mapMenu, expression.first, expression.second );
171  }
172  mapsMenu->addMenu( mapMenu );
173  }
174  menu->addMenu( mapsMenu );
175  menu->addSeparator();
176 
177  if ( layout->reportContext().layer() )
178  {
179  const QgsFields fields = layout->reportContext().layer()->fields();
180 
181  QMenu *fieldsMenu = new QMenu( tr( "Field" ), menu );
182  for ( const QgsField &field : fields )
183  {
184  addExpression( fieldsMenu, field.displayName(), QStringLiteral( "\"%1\"" ).arg( field.name() ) );
185  }
186 
187  menu->addMenu( fieldsMenu );
188  menu->addSeparator();
189  }
190 
191  for ( const std::pair< QString, QString > &expression :
192  {
193  std::make_pair( tr( "Layout Name" ), QStringLiteral( "@layout_name" ) ),
194  std::make_pair( tr( "Layout Page Number" ), QStringLiteral( "@layout_page" ) ),
195  std::make_pair( tr( "Layout Page Count" ), QStringLiteral( "@layout_numpages" ) )
196  } )
197  {
198  addExpression( menu, expression.first, expression.second );
199  }
200  menu->addSeparator();
201  for ( const std::pair< QString, QString > &expression :
202  {
203  std::make_pair( tr( "Project Author" ), QStringLiteral( "@project_author" ) ),
204  std::make_pair( tr( "Project Title" ), QStringLiteral( "@project_title" ) ),
205  std::make_pair( tr( "Project Path" ), QStringLiteral( "@project_path" ) )
206  } )
207  {
208  addExpression( menu, expression.first, expression.second );
209  }
210  menu->addSeparator();
211  for ( const std::pair< QString, QString > &expression :
212  {
213  std::make_pair( tr( "Current User Name" ), QStringLiteral( "@user_full_name" ) ),
214  std::make_pair( tr( "Current User Account" ), QStringLiteral( "@user_account_name" ) )
215  } )
216  {
217  addExpression( menu, expression.first, expression.second );
218  }
219 }
220 
222 {
223  if ( item->type() != QgsLayoutItemRegistry::LayoutLabel )
224  return false;
225 
226  if ( mLabel )
227  {
228  disconnect( mLabel, &QgsLayoutObject::changed, this, &QgsLayoutLabelWidget::setGuiElementValues );
229  }
230 
231  mLabel = qobject_cast< QgsLayoutItemLabel * >( item );
232  mItemPropertiesWidget->setItem( mLabel );
233 
234  if ( mLabel )
235  {
236  connect( mLabel, &QgsLayoutObject::changed, this, &QgsLayoutLabelWidget::setGuiElementValues );
237  }
238 
239  setGuiElementValues();
240 
241  return true;
242 }
243 
244 void QgsLayoutLabelWidget::mHtmlCheckBox_stateChanged( int state )
245 {
246  if ( mLabel )
247  {
248  mVerticalAlignementLabel->setDisabled( state );
249  mTopRadioButton->setDisabled( state );
250  mMiddleRadioButton->setDisabled( state );
251  mBottomRadioButton->setDisabled( state );
252 
253  mLabel->beginCommand( tr( "Change Label Mode" ) );
254  mLabel->blockSignals( true );
255  mLabel->setMode( state ? QgsLayoutItemLabel::ModeHtml : QgsLayoutItemLabel::ModeFont );
256  mLabel->setText( mTextEdit->toPlainText() );
257  mLabel->update();
258  mLabel->blockSignals( false );
259  mLabel->endCommand();
260  }
261 }
262 
263 void QgsLayoutLabelWidget::mTextEdit_textChanged()
264 {
265  if ( mLabel )
266  {
267  mLabel->beginCommand( tr( "Change Label Text" ), QgsLayoutItem::UndoLabelText );
268  mLabel->blockSignals( true );
269  mLabel->setText( mTextEdit->toPlainText() );
270  mLabel->update();
271  mLabel->blockSignals( false );
272  mLabel->endCommand();
273  }
274 }
275 
276 void QgsLayoutLabelWidget::fontChanged()
277 {
278  if ( mLabel )
279  {
280  QFont newFont = mFontButton->currentFont();
281  mLabel->beginCommand( tr( "Change Label Font" ), QgsLayoutItem::UndoLabelFont );
282  mLabel->setFont( newFont );
283  mLabel->update();
284  mLabel->endCommand();
285  }
286 }
287 
288 void QgsLayoutLabelWidget::justifyClicked()
289 {
290  if ( mLabel )
291  {
292  mLabel->beginCommand( tr( "Change Label Alignment" ) );
293  mLabel->setHAlign( Qt::AlignJustify );
294  mLabel->update();
295  mLabel->endCommand();
296  }
297 }
298 
299 void QgsLayoutLabelWidget::mMarginXDoubleSpinBox_valueChanged( double d )
300 {
301  if ( mLabel )
302  {
303  mLabel->beginCommand( tr( "Change Label Margin" ), QgsLayoutItem::UndoLabelMargin );
304  mLabel->setMarginX( d );
305  mLabel->update();
306  mLabel->endCommand();
307  }
308 }
309 
310 void QgsLayoutLabelWidget::mMarginYDoubleSpinBox_valueChanged( double d )
311 {
312  if ( mLabel )
313  {
314  mLabel->beginCommand( tr( "Change Label Margin" ), QgsLayoutItem::UndoLabelMargin );
315  mLabel->setMarginY( d );
316  mLabel->update();
317  mLabel->endCommand();
318  }
319 }
320 
321 void QgsLayoutLabelWidget::mFontColorButton_colorChanged( const QColor &newLabelColor )
322 {
323  if ( !mLabel )
324  {
325  return;
326  }
327 
328  mLabel->beginCommand( tr( "Change Label Color" ), QgsLayoutItem::UndoLabelFontColor );
329  mLabel->setFontColor( newLabelColor );
330  mLabel->update();
331  mLabel->endCommand();
332 }
333 
334 void QgsLayoutLabelWidget::mInsertExpressionButton_clicked()
335 {
336  if ( !mLabel )
337  {
338  return;
339  }
340 
341  QString selText = mTextEdit->textCursor().selectedText();
342 
343  // html editor replaces newlines with Paragraph Separator characters - see https://github.com/qgis/QGIS/issues/27568
344  selText = selText.replace( QChar( 0x2029 ), QChar( '\n' ) );
345 
346  // edit the selected expression if there's one
347  if ( selText.startsWith( QLatin1String( "[%" ) ) && selText.endsWith( QLatin1String( "%]" ) ) )
348  selText = selText.mid( 2, selText.size() - 4 );
349 
350  // use the atlas coverage layer, if any
351  QgsVectorLayer *layer = coverageLayer();
352 
353  QgsExpressionContext context = mLabel->createExpressionContext();
354  QgsExpressionBuilderDialog exprDlg( layer, selText, this, QStringLiteral( "generic" ), context );
355 
356  exprDlg.setWindowTitle( tr( "Insert Expression" ) );
357  if ( exprDlg.exec() == QDialog::Accepted )
358  {
359  QString expression = exprDlg.expressionText();
360  if ( !expression.isEmpty() )
361  {
362  mLabel->beginCommand( tr( "Insert expression" ) );
363  mTextEdit->insertPlainText( "[%" + expression + "%]" );
364  mLabel->endCommand();
365  }
366  }
367 }
368 
369 void QgsLayoutLabelWidget::mCenterRadioButton_clicked()
370 {
371  if ( mLabel )
372  {
373  mLabel->beginCommand( tr( "Change Label Alignment" ) );
374  mLabel->setHAlign( Qt::AlignHCenter );
375  mLabel->update();
376  mLabel->endCommand();
377  }
378 }
379 
380 void QgsLayoutLabelWidget::mRightRadioButton_clicked()
381 {
382  if ( mLabel )
383  {
384  mLabel->beginCommand( tr( "Change Label Alignment" ) );
385  mLabel->setHAlign( Qt::AlignRight );
386  mLabel->update();
387  mLabel->endCommand();
388  }
389 }
390 
391 void QgsLayoutLabelWidget::mLeftRadioButton_clicked()
392 {
393  if ( mLabel )
394  {
395  mLabel->beginCommand( tr( "Change Label Alignment" ) );
396  mLabel->setHAlign( Qt::AlignLeft );
397  mLabel->update();
398  mLabel->endCommand();
399  }
400 }
401 
402 void QgsLayoutLabelWidget::mTopRadioButton_clicked()
403 {
404  if ( mLabel )
405  {
406  mLabel->beginCommand( tr( "Change Label Alignment" ) );
407  mLabel->setVAlign( Qt::AlignTop );
408  mLabel->update();
409  mLabel->endCommand();
410  }
411 }
412 
413 void QgsLayoutLabelWidget::mBottomRadioButton_clicked()
414 {
415  if ( mLabel )
416  {
417  mLabel->beginCommand( tr( "Change Label Alignment" ) );
418  mLabel->setVAlign( Qt::AlignBottom );
419  mLabel->update();
420  mLabel->endCommand();
421  }
422 }
423 
424 void QgsLayoutLabelWidget::mMiddleRadioButton_clicked()
425 {
426  if ( mLabel )
427  {
428  mLabel->beginCommand( tr( "Change Label Alignment" ) );
429  mLabel->setVAlign( Qt::AlignVCenter );
430  mLabel->update();
431  mLabel->endCommand();
432  }
433 }
434 
435 void QgsLayoutLabelWidget::setGuiElementValues()
436 {
437  blockAllSignals( true );
438  mTextEdit->setPlainText( mLabel->text() );
439  mTextEdit->moveCursor( QTextCursor::End, QTextCursor::MoveAnchor );
440  mMarginXDoubleSpinBox->setValue( mLabel->marginX() );
441  mMarginYDoubleSpinBox->setValue( mLabel->marginY() );
442  mHtmlCheckBox->setChecked( mLabel->mode() == QgsLayoutItemLabel::ModeHtml );
443  mTopRadioButton->setChecked( mLabel->vAlign() == Qt::AlignTop );
444  mMiddleRadioButton->setChecked( mLabel->vAlign() == Qt::AlignVCenter );
445  mBottomRadioButton->setChecked( mLabel->vAlign() == Qt::AlignBottom );
446  mLeftRadioButton->setChecked( mLabel->hAlign() == Qt::AlignLeft );
447  mJustifyRadioButton->setChecked( mLabel->hAlign() == Qt::AlignJustify );
448  mCenterRadioButton->setChecked( mLabel->hAlign() == Qt::AlignHCenter );
449  mRightRadioButton->setChecked( mLabel->hAlign() == Qt::AlignRight );
450  mFontColorButton->setColor( mLabel->fontColor() );
451  mFontButton->setCurrentFont( mLabel->font() );
452  mVerticalAlignementLabel->setDisabled( mLabel->mode() == QgsLayoutItemLabel::ModeHtml );
453  mTopRadioButton->setDisabled( mLabel->mode() == QgsLayoutItemLabel::ModeHtml );
454  mMiddleRadioButton->setDisabled( mLabel->mode() == QgsLayoutItemLabel::ModeHtml );
455  mBottomRadioButton->setDisabled( mLabel->mode() == QgsLayoutItemLabel::ModeHtml );
456 
457  blockAllSignals( false );
458 }
459 
460 void QgsLayoutLabelWidget::blockAllSignals( bool block )
461 {
462  mTextEdit->blockSignals( block );
463  mHtmlCheckBox->blockSignals( block );
464  mMarginXDoubleSpinBox->blockSignals( block );
465  mMarginYDoubleSpinBox->blockSignals( block );
466  mTopRadioButton->blockSignals( block );
467  mMiddleRadioButton->blockSignals( block );
468  mBottomRadioButton->blockSignals( block );
469  mLeftRadioButton->blockSignals( block );
470  mCenterRadioButton->blockSignals( block );
471  mRightRadioButton->blockSignals( block );
472  mJustifyRadioButton->blockSignals( block );
473  mFontColorButton->blockSignals( block );
474  mFontButton->blockSignals( block );
475 }
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
A generic dialog for building expression strings.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
QString name
Definition: qgsfield.h:60
QString displayName() const
Returns the name to use when displaying this field.
Definition: qgsfield.cpp:88
Container of fields for a vector layer.
Definition: qgsfields.h:45
@ ModeQFont
Configure font settings for use with QFont objects.
Definition: qgsfontbutton.h:62
void changed()
Emitted when the widget's text format settings are changed.
A base class for property widgets for layout items.
QgsVectorLayer * coverageLayer() const
Returns the current layout context coverage layer (if set).
A layout item subclass for text labels.
@ ModeHtml
Label displays rendered HTML content.
@ ModeFont
Label displays text rendered using a single font.
Layout graphical items for displaying a map.
A widget for controlling the common properties of layout items (e.g.
void setMasterLayout(QgsMasterLayoutInterface *masterLayout)
Sets the master layout associated with the item.
void setItem(QgsLayoutItem *item)
Sets the layout item.
Base class for graphical items within a QgsLayout.
@ UndoLabelFontColor
Label color.
@ UndoLabelMargin
Label margin.
@ UndoLabelFont
Label font.
@ UndoLabelText
Label text.
int type() const override
Returns a unique graphics item type identifier.
void setMasterLayout(QgsMasterLayoutInterface *masterLayout) override
Sets the master layout associated with the item.
bool setNewItem(QgsLayoutItem *item) override
Attempts to update the widget to show the properties for the specified item.
QgsLayoutLabelWidget(QgsLayoutItemLabel *label)
constructor
static void buildInsertDynamicTextMenu(QgsLayout *layout, QMenu *menu, const std::function< void(const QString &expression) > &callback)
Populates the specified menu with actions reflecting dynamic text expressions applicable for a layout...
void changed()
Emitted when the object's properties change.
QgsVectorLayer * layer() const
Returns the vector layer associated with the layout's context.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:50
void layoutItems(QList< T * > &itemList) const
Returns a list of layout items of a specific type.
Definition: qgslayout.h:121
QgsLayoutReportContext & reportContext()
Returns a reference to the layout's report context, which stores information relating to the current ...
Definition: qgslayout.cpp:369
Interface for master layout type objects, such as print layouts and reports.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
A class to represent a 2D point.
Definition: qgspointxy.h:44
double y
Definition: qgspointxy.h:48
Q_GADGET double x
Definition: qgspointxy.h:47
A rectangle specified with double values.
Definition: qgsrectangle.h:42
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:172
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:162
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:167
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:177
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
Definition: qgsrectangle.h:230
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
Represents a vector layer which manages a vector based data sets.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
const QgsField & field
Definition: qgsfield.h:472