21#include "moc_qgslayouttable.cpp" 
   40  styleElem.setAttribute( QStringLiteral( 
"enabled" ), 
enabled );
 
 
   47  enabled = ( styleElem.attribute( QStringLiteral( 
"enabled" ), QStringLiteral( 
"0" ) ) != QLatin1String( 
"0" ) );
 
 
   73  elem.setAttribute( QStringLiteral( 
"cellMargin" ), QString::number( 
mCellMargin ) );
 
   74  elem.setAttribute( QStringLiteral( 
"emptyTableMode" ), QString::number( 
static_cast< int >( 
mEmptyTableMode ) ) );
 
   76  elem.setAttribute( QStringLiteral( 
"showEmptyRows" ), 
mShowEmptyRows );
 
   78  QDomElement headerElem = doc.createElement( QStringLiteral( 
"headerTextFormat" ) );
 
   80  headerElem.appendChild( headerTextElem );
 
   81  elem.appendChild( headerElem );
 
   82  elem.setAttribute( QStringLiteral( 
"headerHAlignment" ), QString::number( 
static_cast< int >( 
mHeaderHAlignment ) ) );
 
   83  elem.setAttribute( QStringLiteral( 
"headerMode" ), QString::number( 
static_cast< int >( 
mHeaderMode ) ) );
 
   85  QDomElement contentElem = doc.createElement( QStringLiteral( 
"contentTextFormat" ) );
 
   87  contentElem.appendChild( contentTextElem );
 
   88  elem.appendChild( contentElem );
 
   89  elem.setAttribute( QStringLiteral( 
"gridStrokeWidth" ), QString::number( 
mGridStrokeWidth ) );
 
   91  elem.setAttribute( QStringLiteral( 
"horizontalGrid" ), 
mHorizontalGrid );
 
   92  elem.setAttribute( QStringLiteral( 
"verticalGrid" ), 
mVerticalGrid );
 
   93  elem.setAttribute( QStringLiteral( 
"showGrid" ), 
mShowGrid );
 
   95  elem.setAttribute( QStringLiteral( 
"wrapBehavior" ), QString::number( 
static_cast< int >( 
mWrapBehavior ) ) );
 
   98  QDomElement displayColumnsElem = doc.createElement( QStringLiteral( 
"displayColumns" ) );
 
  101    QDomElement columnElem = doc.createElement( QStringLiteral( 
"column" ) );
 
  102    column.writeXml( columnElem, doc );
 
  103    displayColumnsElem.appendChild( columnElem );
 
  105  elem.appendChild( displayColumnsElem );
 
  107  QDomElement sortColumnsElem = doc.createElement( QStringLiteral( 
"sortColumns" ) );
 
  110    QDomElement columnElem = doc.createElement( QStringLiteral( 
"column" ) );
 
  111    column.writeXml( columnElem, doc );
 
  112    sortColumnsElem.appendChild( columnElem );
 
  114  elem.appendChild( sortColumnsElem );
 
  118  QDomElement stylesElem = doc.createElement( QStringLiteral( 
"cellStyles" ) );
 
  119  QMap< CellStyleGroup, QString >::const_iterator it = mCellStyleNames.constBegin();
 
  120  for ( ; it != mCellStyleNames.constEnd(); ++it )
 
  122    QString styleName = it.value();
 
  123    QDomElement styleElem = doc.createElement( styleName );
 
  128      stylesElem.appendChild( styleElem );
 
  131  elem.appendChild( stylesElem );
 
 
  138  mEmptyTableMessage = itemElem.attribute( QStringLiteral( 
"emptyTableMessage" ), tr( 
"No matching records" ) );
 
  139  mShowEmptyRows = itemElem.attribute( QStringLiteral( 
"showEmptyRows" ), QStringLiteral( 
"0" ) ).toInt();
 
  141  const QDomElement 
headerTextFormat = itemElem.firstChildElement( QStringLiteral( 
"headerTextFormat" ) );
 
  144    QDomNodeList textFormatNodeList = 
headerTextFormat.elementsByTagName( QStringLiteral( 
"text-style" ) );
 
  145    QDomElement textFormatElem = textFormatNodeList.at( 0 ).toElement();
 
  153      headerFont.fromString( itemElem.attribute( QStringLiteral( 
"headerFont" ), QString() ) );
 
  173  const QDomElement 
contentTextFormat = itemElem.firstChildElement( QStringLiteral( 
"contentTextFormat" ) );
 
  176    QDomNodeList textFormatNodeList = 
contentTextFormat.elementsByTagName( QStringLiteral( 
"text-style" ) );
 
  177    QDomElement textFormatElem = textFormatNodeList.at( 0 ).toElement();
 
  185      contentFont.fromString( itemElem.attribute( QStringLiteral( 
"contentFont" ), QString() ) );
 
  202  mCellMargin = itemElem.attribute( QStringLiteral( 
"cellMargin" ), QStringLiteral( 
"1.0" ) ).toDouble();
 
  203  mGridStrokeWidth = itemElem.attribute( QStringLiteral( 
"gridStrokeWidth" ), QStringLiteral( 
"0.5" ) ).toDouble();
 
  204  mHorizontalGrid = itemElem.attribute( QStringLiteral( 
"horizontalGrid" ), QStringLiteral( 
"1" ) ).toInt();
 
  205  mVerticalGrid = itemElem.attribute( QStringLiteral( 
"verticalGrid" ), QStringLiteral( 
"1" ) ).toInt();
 
  206  mShowGrid = itemElem.attribute( QStringLiteral( 
"showGrid" ), QStringLiteral( 
"1" ) ).toInt();
 
  213  QDomNodeList columnsList = itemElem.elementsByTagName( QStringLiteral( 
"displayColumns" ) );
 
  214  if ( !columnsList.isEmpty() )
 
  216    QDomElement columnsElem = columnsList.at( 0 ).toElement();
 
  217    QDomNodeList columnEntryList = columnsElem.elementsByTagName( QStringLiteral( 
"column" ) );
 
  218    for ( 
int i = 0; i < columnEntryList.size(); ++i )
 
  220      QDomElement columnElem = columnEntryList.at( i ).toElement();
 
  228  QDomNodeList sortColumnsList = itemElem.elementsByTagName( QStringLiteral( 
"sortColumns" ) );
 
  229  if ( !sortColumnsList.isEmpty() )
 
  231    QDomElement columnsElem = sortColumnsList.at( 0 ).toElement();
 
  232    QDomNodeList columnEntryList = columnsElem.elementsByTagName( QStringLiteral( 
"column" ) );
 
  233    for ( 
int i = 0; i < columnEntryList.size(); ++i )
 
  235      QDomElement columnElem = columnEntryList.at( i ).toElement();
 
  252  QDomNodeList stylesList = itemElem.elementsByTagName( QStringLiteral( 
"cellStyles" ) );
 
  253  if ( !stylesList.isEmpty() )
 
  255    QDomElement stylesElem = stylesList.at( 0 ).toElement();
 
  257    QMap< CellStyleGroup, QString >::const_iterator it = mCellStyleNames.constBegin();
 
  258    for ( ; it != mCellStyleNames.constEnd(); ++it )
 
  260      QString styleName = it.value();
 
  261      QDomNodeList styleList = stylesElem.elementsByTagName( styleName );
 
  262      if ( !styleList.isEmpty() )
 
  264        QDomElement styleElem = styleList.at( 0 ).toElement();
 
 
  290  double headerHeight = 0;
 
  302  double contentHeight = frameHeight - headerHeight;
 
  306  int currentRow = firstRow;
 
  307  while ( contentHeight > 0 && currentRow <= 
mTableContents.count() )
 
  310    contentHeight -= currentRowHeight;
 
  314  if ( includeEmptyRows && contentHeight > 0 )
 
  318    currentRow += std::max( std::floor( contentHeight / rowHeight ), 0.0 );
 
  321  return currentRow - firstRow - 1;
 
 
  333  bool includeHeader = 
false;
 
  337    includeHeader = 
true;
 
  339  return rowsVisible( context, frameExtent.height(), firstRow, includeHeader, includeEmptyRows );
 
 
  348    return qMakePair( 0, 0 );
 
  353  int rowsAlreadyShown = 0;
 
  356    rowsAlreadyShown += 
rowsVisible( context, idx, rowsAlreadyShown, 
false );
 
  360  int firstVisible = std::min( rowsAlreadyShown, 
static_cast<int>( 
mTableContents.length() ) );
 
  362  int lastVisible = std::min( firstVisible + possibleRowsVisible, 
static_cast<int>( 
mTableContents.length() ) );
 
  364  return qMakePair( firstVisible, lastVisible );
 
 
  376  if ( !
mLayout->renderContext().isPreviewRender() )
 
  401  int numberRowsToDraw = rowsToShow.second - rowsToShow.first;
 
  402  int numberEmptyRows = 0;
 
  406    numberEmptyRows = numberRowsToDraw - rowsToShow.second + rowsToShow.first;
 
  408  bool mergeCells = 
false;
 
  423  p->setPen( Qt::SolidLine );
 
  425  double currentX = gridSizeX;
 
  426  double currentY = gridSizeY;
 
  433      auto headerCellScope = std::make_unique< QgsExpressionContextScope >();
 
  434      headerCellScope->setVariable( QStringLiteral( 
"column_number" ), col + 1, 
true );
 
  440      p->setPen( Qt::NoPen );
 
  469      const QStringList str = column.heading().split( 
'\n' );
 
  485      currentX += gridSizeX;
 
  489    currentY += cellHeaderHeight;
 
  490    currentY += gridSizeY;
 
  495  std::set< std::pair< int, int > > spannedCells;
 
  499    for ( 
int row = rowsToShow.first; row < rowsToShow.second; ++row )
 
  502      currentX = gridSizeX;
 
  509        bool isSpanned = 
false;
 
  512        double cellHeight = 0;
 
  513        double cellWidth = 0;
 
  514        const int rowsSpan = 
rowSpan( row, col );
 
  516        if ( spannedCells.find( std::make_pair( row, col ) ) != spannedCells.end() )
 
  522          for ( 
int spannedRow = row; spannedRow < row + rowsSpan; ++spannedRow )
 
  525                          + ( spannedRow > row ? gridSizeY : 0 );
 
  526            for ( 
int spannedCol = col; spannedCol < col + colsSpan; ++spannedCol )
 
  528              spannedCells.insert( std::make_pair( spannedRow, spannedCol ) );
 
  531          for ( 
int spannedCol = col; spannedCol < col + colsSpan; ++spannedCol )
 
  534                         + ( spannedCol > col ? gridSizeX : 0 );
 
  538        fullCell = QRectF( currentX, currentY, cellWidth, cellHeight );
 
  544          p->setPen( Qt::NoPen );
 
  546          p->drawRect( fullCell );
 
  556          const QString localizedString { QgsExpressionUtils::toLocalizedString( cellContents ) };
 
  557          const QStringList str = localizedString.split( 
'\n' );
 
  564          p->setClipRect( fullCell );
 
  568          QColor foreColor = cellFormat.
color();
 
  590        currentX += gridSizeX;
 
  594      currentY += gridSizeY;
 
  598  if ( numberRowsToDraw > rowsDrawn )
 
  601    p->setPen( Qt::NoPen );
 
  604    for ( 
int row = rowsDrawn; row < numberRowsToDraw; ++row )
 
  606      currentX = gridSizeX;
 
  612        p->drawRect( QRectF( gridSizeX, currentY, 
mTableSize.width() - 2 * gridSizeX, cellBodyHeightForEmptyRows ) );
 
  628          currentX += gridSizeX;
 
  632      currentY += cellBodyHeightForEmptyRows + gridSizeY;
 
  643    gridPen.setJoinStyle( Qt::MiterJoin );
 
  644    gridPen.setCapStyle( Qt::FlatCap );
 
  645    p->setPen( gridPen );
 
  660    double messageY = gridSizeY + ( drawHeader ? cellHeaderHeight + gridSizeY : 0 );
 
  661    cell = QRectF( messageX, messageY, 
mTableSize.width() - messageX, cellBodyHeightForEmptyRows );
 
 
  737  if ( font.pointSizeF() > 0 )
 
  742  else if ( font.pixelSize() > 0 )
 
 
  821  if ( font.pointSizeF() > 0 )
 
  826  else if ( font.pixelSize() > 0 )
 
 
  981  if ( !newSortColumns.isEmpty() )
 
 
 1012  QMap<int, QString> headers;
 
 1017    headers.insert( i, col.heading() );
 
 
 1025  auto cellScope = std::make_unique< QgsExpressionContextScope >();
 
 1026  cellScope->setVariable( QStringLiteral( 
"row_number" ), row + 1, 
true );
 
 1027  cellScope->setVariable( QStringLiteral( 
"column_number" ), column + 1, 
true );
 
 1028  return cellScope.release();
 
 
 1062    for ( 
int col = 0; col < 
mColumns.size(); ++ col )
 
 1067  return QSizeF( 0, height );
 
 
 1089void QgsLayoutTable::initStyles()
 
 1101  mCellStyleNames.insert( 
OddColumns, QStringLiteral( 
"oddColumns" ) );
 
 1102  mCellStyleNames.insert( 
EvenColumns, QStringLiteral( 
"evenColumns" ) );
 
 1103  mCellStyleNames.insert( 
OddRows, QStringLiteral( 
"oddRows" ) );
 
 1104  mCellStyleNames.insert( 
EvenRows, QStringLiteral( 
"evenRows" ) );
 
 1105  mCellStyleNames.insert( 
FirstColumn, QStringLiteral( 
"firstColumn" ) );
 
 1106  mCellStyleNames.insert( 
LastColumn, QStringLiteral( 
"lastColumn" ) );
 
 1107  mCellStyleNames.insert( 
HeaderRow, QStringLiteral( 
"headerRow" ) );
 
 1108  mCellStyleNames.insert( 
FirstRow, QStringLiteral( 
"firstRow" ) );
 
 1109  mCellStyleNames.insert( 
LastRow, QStringLiteral( 
"lastRow" ) );
 
 1119  QVector< double > widths( cells );
 
 1121  double currentCellTextWidth;
 
 1130    if ( col.width() > 0 )
 
 1133      widths[i] = col.width();
 
 1137      auto headerCellScope = std::make_unique< QgsExpressionContextScope >();
 
 1138      headerCellScope->setVariable( QStringLiteral( 
"column_number" ), i + 1, 
true );
 
 1142      const QStringList multiLineSplit = col.heading().split( 
'\n' );
 
 1144      widths[i] = currentCellTextWidth;
 
 1154  QgsLayoutTableContents::const_iterator rowIt = 
mTableContents.constBegin();
 
 1158    QgsLayoutTableRow::const_iterator colIt = rowIt->constBegin();
 
 1160    for ( ; colIt != rowIt->constEnd(); ++colIt )
 
 1162      if ( 
mColumns.at( col ).width() <= 0 )
 
 1165        const QStringList multiLineSplit = QgsExpressionUtils::toLocalizedString( *colIt ).split( 
'\n' );
 
 1172        widths[ row * cols + col ] = currentCellTextWidth;
 
 1176        widths[ row * cols + col ] = 0;
 
 1185  for ( 
int col = 0; col < cols; ++col )
 
 1187    double maxColWidth = 0;
 
 1190      maxColWidth = std::max( widths[ row * cols + col ], maxColWidth );
 
 
 1205  QVector< double > heights( cells );
 
 1214    auto headerCellScope = std::make_unique< QgsExpressionContextScope >();
 
 1215    headerCellScope->setVariable( QStringLiteral( 
"column_number" ), i + 1, 
true );
 
 1241  QgsLayoutTableContents::const_iterator rowIt = 
mTableContents.constBegin();
 
 1245    QgsLayoutTableRow::const_iterator colIt = rowIt->constBegin();
 
 1247    for ( ; colIt != rowIt->constEnd(); ++colIt )
 
 1253      const QString localizedString { QgsExpressionUtils::toLocalizedString( *colIt ) };
 
 1257                                  QStringList() << localizedString.split( 
'\n' ),
 
 1272    double maxRowHeight = 0;
 
 1273    for ( 
int col = 0; col < cols; ++col )
 
 1275      maxRowHeight = std::max( heights[ row * cols + col ], maxRowHeight );
 
 
 1319  int rowsAlreadyShown = 0;
 
 1321  int rowsVisibleInLastFrame = 0;
 
 1322  double heightOfLastFrame = 0;
 
 1323  for ( 
int idx = 0; idx < numberExistingFrames; ++idx )
 
 1327    heightOfLastFrame = 
frame( idx )->rect().height();
 
 1328    rowsVisibleInLastFrame = 
rowsVisible( context, heightOfLastFrame, rowsAlreadyShown, hasHeader, 
false );
 
 1329    rowsAlreadyShown += rowsVisibleInLastFrame;
 
 1330    height += heightOfLastFrame;
 
 1341  if ( remainingRows <= 0 )
 
 1357  int numberFramesMissing = 0;
 
 1358  while ( remainingRows > 0 )
 
 1360    numberFramesMissing++;
 
 1362    rowsVisibleInLastFrame = 
rowsVisible( context, heightOfLastFrame, rowsAlreadyShown, hasHeader, 
false );
 
 1363    if ( rowsVisibleInLastFrame < 1 )
 
 1370    rowsAlreadyShown += rowsVisibleInLastFrame;
 
 1376  height += heightOfLastFrame * numberFramesMissing;
 
 
 1383  if ( lastRow - firstRow < 1 && !drawHeaderLines )
 
 1392  double currentY = halfGridStrokeWidth;
 
 1393  if ( drawHeaderLines )
 
 1395    painter->drawLine( QPointF( 0, currentY ), QPointF( 
mTableSize.width(), currentY ) );
 
 1400  QHash< QPair< int, int >, 
bool > skippedCellBottomBorders;
 
 1401  for ( 
int row = 0; row < lastRow; ++row )
 
 1403    for ( 
int col = 0; col < 
mColumns.size(); ++col )
 
 1405      if ( skippedCellBottomBorders.constFind( qMakePair( row, col ) ) != skippedCellBottomBorders.constEnd() )
 
 1408      const int rowsSpan = 
rowSpan( row, col );
 
 1410      skippedCellBottomBorders.insert( qMakePair( row, col ), rowsSpan > 1 );
 
 1411      for ( 
int rowDelta = 0; rowDelta < rowsSpan - 1; ++rowDelta )
 
 1413        for ( 
int colDelta = 0; colDelta < colsSpan; ++colDelta )
 
 1415          if ( rowDelta != 0 || colDelta != 0 )
 
 1416            skippedCellBottomBorders.insert( qMakePair( row + rowDelta, col + colDelta ), 
true );
 
 1422  for ( 
int row = firstRow; row < lastRow; ++row )
 
 1425    double endX = startX;
 
 1427    for ( 
int col = 0; col < 
mColumns.size(); ++col )
 
 1431      if ( skippedCellBottomBorders.value( qMakePair( row - 1, col ) ) )
 
 1436          painter->drawLine( QPointF( startX, currentY ), QPointF( endX, currentY ) );
 
 1452      painter->drawLine( QPointF( startX, currentY ), QPointF( endX, currentY ) );
 
 1459  painter->drawLine( QPointF( 0, currentY ), QPointF( 
mTableSize.width(), currentY ) );
 
 
 1466    if ( style->enabled && column % 2 == 0 )
 
 1467      color = style->cellBackgroundColor;
 
 1469    if ( style->enabled && column % 2 == 1 )
 
 1470      color = style->cellBackgroundColor;
 
 1472    if ( style->enabled && row % 2 == 0 )
 
 1473      color = style->cellBackgroundColor;
 
 1475    if ( style->enabled && row % 2 == 1 )
 
 1476      color = style->cellBackgroundColor;
 
 1478    if ( style->enabled && column == 0 )
 
 1479      color = style->cellBackgroundColor;
 
 1482      color = style->cellBackgroundColor;
 
 1484    if ( style->enabled && row == -1 )
 
 1485      color = style->cellBackgroundColor;
 
 1487    if ( style->enabled && row == 0 )
 
 1488      color = style->cellBackgroundColor;
 
 1491      color = style->cellBackgroundColor;
 
 1506  if ( lastRow - firstRow < 1 && !hasHeader )
 
 1511  QHash< QPair< int, int >, 
bool > skippedCellRightBorders;
 
 1512  for ( 
int row = 0; row < lastRow; ++row )
 
 1514    for ( 
int col = 0; col < 
mColumns.size(); ++col )
 
 1516      if ( skippedCellRightBorders.constFind( qMakePair( row, col ) ) != skippedCellRightBorders.constEnd() )
 
 1519      const int rowsSpan = 
rowSpan( row, col );
 
 1521      skippedCellRightBorders.insert( qMakePair( row, col ), colsSpan > 1 );
 
 1523      for ( 
int colDelta = 0; colDelta < colsSpan - 1; ++colDelta )
 
 1525        for ( 
int rowDelta = 0; rowDelta < rowsSpan; ++rowDelta )
 
 1527          if ( rowDelta != 0 || colDelta != 0 )
 
 1528            skippedCellRightBorders.insert( qMakePair( row + rowDelta, col + colDelta ), 
true );
 
 1537  double tableHeight = 0;
 
 1538  QList< double > rowHeights;
 
 1549  double headerHeight = tableHeight;
 
 1552  for ( 
int row = firstRow; row < lastRow; ++row )
 
 1561  painter->drawLine( QPointF( currentX, 0 ), QPointF( currentX, tableHeight ) );
 
 1563  QMap<int, double>::const_iterator maxColWidthIt = maxWidthMap.constBegin();
 
 1565  for ( ; maxColWidthIt != maxWidthMap.constEnd(); ++maxColWidthIt )
 
 1567    currentX += ( maxColWidthIt.value() + 2 * 
mCellMargin );
 
 1568    if ( col == maxWidthMap.size() )
 
 1571      painter->drawLine( QPointF( currentX, 0 ), QPointF( currentX, tableHeight ) );
 
 1579        for ( 
int row = firstRow; row < lastRow; ++row )
 
 1581          const double rowHeight = rowHeights.value( row - firstRow + 1 );
 
 1582          if ( skippedCellRightBorders.value( qMakePair( row, col - 1 ) ) )
 
 1587              painter->drawLine( QPointF( currentX, startY ), QPointF( currentX, endY ) );
 
 1603          painter->drawLine( QPointF( currentX, startY ), QPointF( currentX, endY ) );
 
 1606      else if ( hasHeader )
 
 1608        painter->drawLine( QPointF( currentX, 0 ), QPointF( currentX, headerHeight ) );
 
 
 1628  return ( 
contents.indexOf( row ) >= 0 );
 
 
 1643  return mColumns.value( column ).hAlignment();
 
 
 1648  return mColumns.value( column ).vAlignment();
 
 
@ Rectangle
Text within rectangle layout mode.
 
QFlags< TextRendererFlag > TextRendererFlags
 
@ Millimeters
Millimeters.
 
@ Points
Points (e.g., for font sizes)
 
@ ApplyScalingWorkaroundForTextRendering
Whether a scaling workaround designed to stablise the rendering of small font sizes (or for painters ...
 
@ VerticalCenter
Center align.
 
TextHorizontalAlignment
Text horizontal alignment.
 
@ WrapLines
Automatically wrap long lines of text.
 
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.
 
Conditional styling for a rule.
 
QColor backgroundColor() const
The background color for style.
 
QColor textColor() const
The text color set for style.
 
RAII class to pop scope from an expression context on destruction.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
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.
 
QRectF extent() const
Returns the visible portion of the multi frame's content which is shown in this frame,...
 
Item representing the paper in a layout.
 
Contains settings and helpers relating to a render of a QgsLayoutItem.
 
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
 
QgsLayoutSize sizeWithUnits() const
Returns the item's current size, including units.
 
int page() const
Returns the page the item is currently on, with the first page returning 0.
 
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
 
int frameCount() const
Returns the number of frames associated with this multiframe.
 
QgsLayoutFrame * frame(int index) const
Returns the child frame at a specified index from the multiframe.
 
@ ExtendToNextPage
Creates new full page frames on the following page(s) until the entire multiframe content is visible.
 
void refresh() override
Refreshes the multiframe, causing a recalculation of any property overrides.
 
virtual void recalculateFrameSizes()
Recalculates the portion of the multiframe item which is shown in each of its component frames.
 
void update()
Forces a redraw of all child frames.
 
int frameIndex(QgsLayoutFrame *frame) const
Returns the index of a frame within the multiframe.
 
void recalculateFrameRects()
Forces a recalculation of all the associated frame's scene rectangles.
 
void changed()
Emitted when the object's properties change.
 
QPointer< QgsLayout > mLayout
 
double height() const
Returns the height of the size.
 
Stores properties of a column for a QgsLayoutTable.
 
bool readXml(const QDomElement &columnElem)
Reads the column's properties from xml.
 
Styling option for a layout table cell.
 
bool readXml(const QDomElement &styleElem)
Reads the style's properties from XML.
 
QColor cellBackgroundColor
Cell background color.
 
bool enabled
Whether the styling option is enabled.
 
bool writeXml(QDomElement &styleElem, QDomDocument &doc) const
Writes the style's properties to XML for storage.
 
bool mHorizontalGrid
True if grid should be shown.
 
QSizeF fixedFrameSize(int frameIndex=-1) const override
Returns the fixed size for a frame, if desired.
 
QgsLayoutTableColumns & columns()
Returns a reference to the list of QgsLayoutTableColumns shown in the table.
 
void setColumns(const QgsLayoutTableColumns &columns)
Replaces the columns in the table with a specified list of QgsLayoutTableColumns.
 
Q_DECL_DEPRECATED void setHeaderFontColor(const QColor &color)
Sets the color used to draw header text in the table.
 
QgsLayoutTable(QgsLayout *layout)
Constructor for QgsLayoutTable, belonging to the specified layout.
 
virtual Qt::Alignment horizontalAlignmentForCell(int row, int column) const
Returns the horizontal alignment to use for the cell at the specified row and column.
 
QColor backgroundColor() const
Returns the color used for the background of the table.
 
virtual QgsConditionalStyle conditionalCellStyle(int row, int column) const
Returns the conditional style to use for the cell at row, column.
 
void setHeaderHAlignment(HeaderHAlignment alignment)
Sets the horizontal alignment for table headers.
 
void setShowEmptyRows(bool showEmpty)
Sets whether empty rows should be drawn.
 
Q_DECL_DEPRECATED QFont headerFont() const
Returns the font used to draw header text in the table.
 
QMap< int, double > mMaxColumnWidthMap
Map of maximum width for each column.
 
void setVerticalGrid(bool verticalGrid)
Sets whether the grid's vertical lines should be drawn in the table.
 
virtual void refreshAttributes()
Refreshes the contents shown in the table by querying for new data.
 
void setGridColor(const QColor &color)
Sets the color used for grid lines in the table.
 
double totalWidth()
Returns total width of table contents.
 
bool horizontalGrid() const
Returns whether the grid's horizontal lines are drawn in the table.
 
Q_DECL_DEPRECATED void setContentFontColor(const QColor &color)
Sets the color used to draw text in table body cells.
 
void setCellMargin(double margin)
Sets the margin distance in mm between cell borders and their contents.
 
void render(QgsLayoutItemRenderContext &context, const QRectF &renderExtent, int frameIndex) override
Renders a portion of the multiframe's content into a render context.
 
Q_DECL_DEPRECATED void setHeaderFont(const QFont &font)
Sets the font used to draw header text in the table.
 
void drawVerticalGridLines(QgsLayoutItemRenderContext &context, const QMap< int, double > &maxWidthMap, int firstRow, int lastRow, bool hasHeader, bool mergeCells=false) const
Draws the vertical grid lines for the table.
 
QgsLayoutTableSortColumns & sortColumns()
Returns a reference to the list of QgsLayoutTableSortColumns shown in the table.
 
void setBackgroundColor(const QColor &color)
Sets the color used for background of table.
 
void setContentTextFormat(const QgsTextFormat &format)
Sets the format used to draw content text in the table.
 
QgsTextFormat contentTextFormat() const
Returns the format used to draw content text in the table.
 
QString mEmptyTableMessage
String to show in empty tables.
 
virtual int rowSpan(int row, int column) const
Returns the row span for the cell a row, column.
 
void setWrapBehavior(WrapBehavior behavior)
Sets the wrap behavior for the table, which controls how text within cells is automatically wrapped.
 
Q_DECL_DEPRECATED QColor headerFontColor() const
Returns the color used to draw header text in the table.
 
QPair< int, int > rowRange(QgsRenderContext &context, int frameIndex) const
Calculates a range of rows which should be visible in a given frame.
 
double mGridStrokeWidth
Width of grid lines.
 
EmptyTableMode mEmptyTableMode
Behavior for empty tables.
 
void setEmptyTableBehavior(EmptyTableMode mode)
Sets the behavior mode for empty tables with no content rows.
 
virtual QgsTextFormat textFormatForHeader(int column) const
Returns the text format to use for the header cell at the specified column.
 
void setHeaderMode(HeaderMode mode)
Sets the display mode for headers in the table.
 
Q_DECL_DEPRECATED void setContentFont(const QFont &font)
Sets the font used to draw text in table body cells.
 
WrapBehavior mWrapBehavior
 
bool verticalGrid() const
Returns whether the grid's vertical lines are drawn in the table.
 
QColor mBackgroundColor
Color for table background.
 
void recalculateTableSize()
Recalculates and updates the size of the table and all table frames.
 
void drawHorizontalGridLines(QgsLayoutItemRenderContext &context, int firstRow, int lastRow, bool drawHeaderLines) const
Draws the horizontal grid lines for the table.
 
virtual QgsExpressionContextScope * scopeForCell(int row, int column) const
Creates a new QgsExpressionContextScope for the cell at row, column.
 
Q_DECL_DEPRECATED QFont contentFont() const
Returns the font used to draw text in table body cells.
 
bool contentsContainsRow(const QgsLayoutTableContents &contents, const QgsLayoutTableRow &row) const
Checks whether a table contents contains a given row.
 
bool mShowGrid
True if grid should be shown.
 
CellStyleGroup
Row or column groups for cell styling.
 
@ FirstRow
Style first row only.
 
@ EvenColumns
Style even numbered columns.
 
@ EvenRows
Style even numbered rows.
 
@ HeaderRow
Style header row.
 
@ OddColumns
Style odd numbered columns.
 
@ FirstColumn
Style first column only.
 
@ LastColumn
Style last column only.
 
@ LastRow
Style last row only.
 
@ OddRows
Style odd numbered rows.
 
QgsTextFormat mHeaderTextFormat
 
void setHorizontalGrid(bool horizontalGrid)
Sets whether the grid's horizontal lines should be drawn in the table.
 
HeaderMode
Controls where headers are shown in the table.
 
@ FirstFrame
Header shown on first frame only.
 
@ AllFrames
Headers shown on all frames.
 
@ NoHeaders
No headers shown for table.
 
void setCellStyle(CellStyleGroup group, const QgsLayoutTableStyle &style)
Sets the cell style for a cell group.
 
QgsLayoutTableColumns mColumns
Columns to show in table.
 
const QgsLayoutTableStyle * cellStyle(CellStyleGroup group) const
Returns the cell style for a cell group.
 
void setShowGrid(bool showGrid)
Sets whether grid lines should be drawn in the table.
 
QgsTextFormat mContentTextFormat
 
virtual bool getTableContents(QgsLayoutTableContents &contents)=0
Fetches the contents used for the cells in the table.
 
virtual bool calculateMaxColumnWidths()
Calculates the maximum width of text shown in columns.
 
~QgsLayoutTable() override
 
QgsTextFormat headerTextFormat() const
Returns the format used to draw header text in the table.
 
HeaderMode mHeaderMode
Header display mode.
 
HeaderHAlignment mHeaderHAlignment
Alignment for table headers.
 
int rowsVisible(QgsRenderContext &context, double frameHeight, int firstRow, bool includeHeader, bool includeEmptyRows) const
Calculates how many content rows would be visible within a frame of the specified height.
 
void recalculateFrameSizes() override
 
bool mShowEmptyRows
True if empty rows should be shown in the table.
 
QColor mGridColor
Color for grid lines.
 
QSizeF minFrameSize(int frameIndex=-1) const override
Returns the minimum size for a frames, if desired.
 
double mCellMargin
Margin between cell borders and cell text.
 
virtual Qt::Alignment verticalAlignmentForCell(int row, int column) const
Returns the vertical alignment to use for the cell at the specified row and column.
 
Q_DECL_DEPRECATED QColor contentFontColor() const
Returns the color used to draw text in table body cells.
 
double totalHeight()
Returns total height of table contents.
 
QgsLayoutTableContents mTableContents
Contents to show in table.
 
bool writePropertiesToElement(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Stores multiframe state within an XML DOM element.
 
void setEmptyTableMessage(const QString &message)
Sets the message for empty tables with no content rows.
 
virtual int columnSpan(int row, int column) const
Returns the column span for the cell a row, column.
 
void setSortColumns(const QgsLayoutTableSortColumns &sortColumns)
Replaces the sorting columns in the table with a specified list of QgsLayoutTableSortColumns.
 
void setHeaderTextFormat(const QgsTextFormat &format)
Sets the format used to draw header text in the table.
 
QgsLayoutTableSortColumns mSortColumns
Columns to sort the table.
 
bool showGrid() const
Returns whether grid lines are drawn in the table.
 
virtual QMap< int, QString > headerLabels() const
Returns the text used in the column headers for the table.
 
void setGridStrokeWidth(double width)
Sets the width in mm for grid lines in the table.
 
virtual QgsTextFormat textFormatForCell(int row, int column) const
Returns the text format to use for the cell at the specified row and column.
 
bool readPropertiesFromElement(const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context) override
Sets multiframe state from a DOM element.
 
QgsLayoutTableContents & contents()
Returns the current contents of the table.
 
QSizeF totalSize() const override
Returns the total size of the multiframe's content, in layout units.
 
bool mVerticalGrid
True if grid should be shown.
 
virtual bool calculateMaxRowHeights()
Calculates the maximum height of text shown in rows.
 
WrapBehavior
Controls how long strings in the table are handled.
 
@ WrapText
Text which doesn't fit inside the cell is wrapped. Note that this only applies to text in columns wit...
 
HeaderHAlignment
Controls how headers are horizontally aligned in a table.
 
@ HeaderRight
Align headers right.
 
@ HeaderLeft
Align headers left.
 
@ HeaderCenter
Align headers to center.
 
@ FollowColumn
Header uses the same alignment as the column.
 
EmptyTableMode
Controls how empty tables are displayed.
 
@ HideTable
Hides entire table if empty.
 
@ ShowMessage
Shows preset message instead of table contents.
 
QMap< int, double > mMaxRowHeightMap
Map of maximum height for each row.
 
QMap< CellStyleGroup, QgsLayoutTableStyle * > mCellStyles
 
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.
 
A container for the context for various read/write operations on 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.
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
bool testFlag(Qgis::RenderContextFlag flag) const
Check whether a particular flag is enabled.
 
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.
 
Scoped object for temporary scaling of a QgsRenderContext for pixel based rendering.
 
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 updateDataDefinedProperties(QgsRenderContext &context)
Updates the format by evaluating current values of data defined properties.
 
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
 
QFont toQFont() const
Returns a QFont matching the relevant settings from this text format.
 
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
 
QColor color() const
Returns the color that text will be rendered in.
 
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 QFontMetricsF fontMetrics(QgsRenderContext &context, const QgsTextFormat &format, double scaleFactor=1.0)
Returns the font metrics for the given text format, when rendered in the specified render context.
 
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 constexpr double FONT_WORKAROUND_SCALE
Scale factor for upscaling font sizes and downscaling destination painter devices.
 
static Qgis::TextHorizontalAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a Qgis::TextHorizontalAlignment value.
 
QVector< QgsLayoutTableColumn > QgsLayoutTableColumns
List of column definitions for a QgsLayoutTable.
 
QVector< QgsLayoutTableColumn > QgsLayoutTableSortColumns
List of column definitions for sorting a QgsLayoutTable.
 
QVector< QgsLayoutTableRow > QgsLayoutTableContents
List of QgsLayoutTableRows, representing rows and column cell contents for a QgsLayoutTable.
 
QVector< QVariant > QgsLayoutTableRow
List of QVariants, representing a the contents of a single row in a QgsLayoutTable.
 
#define Q_NOWARN_DEPRECATED_POP
 
#define Q_NOWARN_DEPRECATED_PUSH
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)