KD Reports API Documentation  2.1
KDReportsReport.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** This file is part of the KD Reports library.
4 **
5 ** SPDX-FileCopyrightText: 2007-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDAB-KDReports OR LicenseRef-KDAB-KDReports-US
8 **
9 ** Licensees holding valid commercial KD Reports licenses may use this file in
10 ** accordance with the KD Reports Commercial License Agreement provided with
11 ** the Software.
12 **
13 ** Contact info@kdab.com if any conditions of this licensing are not clear to you.
14 **
15 ****************************************************************************/
16 
17 #include "KDReportsReport.h"
18 #include "KDReportsReport_p.h"
19 #include "KDReportsElement.h"
20 #include "KDReportsHeader.h"
22 #include "KDReportsMainTable.h"
25 #include "KDReportsXmlParser_p.h"
26 
27 #include <QAbstractTextDocumentLayout>
28 #include <QApplication>
29 #include <QDebug>
30 #include <QDomDocument>
31 #include <QDomElement>
32 #include <QFile>
33 #include <QMap>
34 #include <QPainter>
35 #include <QPointer>
36 #include <QPrintDialog>
37 #include <QProgressDialog>
38 #include <QStyle>
39 #include <QStyleOption>
40 #include <QThread>
41 
42 #include <memory>
43 
44 QT_BEGIN_NAMESPACE
45 Q_GUI_EXPORT extern int qt_defaultDpi(); // This is what QTextDocument uses...
46 QT_END_NAMESPACE
47 
49  : m_layoutWidth(0)
50  , m_endlessPrinterWidth(0)
51  , m_orientation(QPageLayout::Portrait)
52  , m_pageSize(QPageSize::A4)
53  , m_marginTop(20.0)
54  , // warning, defaults are duplicated in KDReportsXmlParser.cpp
55  m_marginLeft(20.0)
56  , m_marginBottom(20.0)
57  , m_marginRight(20.0)
58  , m_headerBodySpacing(0)
59  , m_footerBodySpacing(0)
60  , m_headers()
61  , m_footers()
62  , m_watermarkRotation(0)
63  , m_watermarkColor(QColor(204, 204, 204))
64  , m_watermarkFont(QFont(QStringLiteral("Helvetica"), 48))
65  , m_watermarkImage()
66  ,
67 #if 0
68  m_numHorizontalPages( 1 ),
69  m_numVerticalPages( 0 ),
70  m_scaleFontsBy( 1.0 ),
71  m_autoScale( false ),
72  m_tableBreakingPageOrder( KDReports::Report::DownThenRight ),
73 #endif
74  m_firstPageNumber(1)
75  , m_pageContentSizeDirty(true)
76  , m_xmlElementHandler(nullptr)
77  , m_currentRow(-1)
78  , m_currentModel(nullptr)
79  , m_reportMode(KDReports::Report::WordProcessing)
80  , m_layout(new TextDocReportLayout(report))
81  , m_mainTable(new MainTable)
82  , q(report)
83 {
84 }
85 
87 {
88  delete m_layout;
89  delete m_mainTable;
90 }
91 
93 {
94  return m_layoutWidth > 0;
95 }
96 
98 {
99  // determine m_paperSize from m_pageSize if needed
100  if (m_paperSize.isEmpty()) {
101  const auto mmSize = m_pageSize.size(QPageSize::Millimeter);
102  m_paperSize = QSizeF{mmToPixels(mmSize.width()), mmToPixels(mmSize.height())};
103  if (m_orientation == QPageLayout::Landscape) {
104  m_paperSize.transpose();
105  }
106  }
107  // qDebug() << "m_paperSize=" << m_paperSize;
108  return m_paperSize;
109 }
110 
112 {
113  // We need to do a layout if
114  // m_pageContentSizeDirty is true, i.e. page size has changed etc.
115  if (m_pageContentSizeDirty) {
116  if (!wantEndlessPrinting()) {
117  setPaperSizeFromPrinter(paperSize());
118  } else {
119  // Get the document to fit into one page
120  Q_ASSERT(m_layoutWidth != 0);
121  qreal textDocWidth = m_layoutWidth - mmToPixels(m_marginLeft + m_marginRight);
122  m_paperSize = layoutAsOnePage(textDocWidth);
123 
124  qDebug() << "setPaperSizeFromPrinter: endless printer. m_layoutWidth=" << m_layoutWidth << "textDocWidth=" << textDocWidth << "single page has size" << m_paperSize << "pixels";
125 
126  /* cppcheck-suppress assertWithSideEffect */
127  Q_ASSERT(m_layout->numberOfPages() == 1);
128  }
129  // at this point m_pageContentSizeDirty has been set to false in all cases
130  }
131 
132  m_layout->ensureLayouted();
133 }
134 
135 // The height of the text doc, by calculation. Adjusted by caller, if negative.
137 {
138  qreal textDocHeight = paperSize().height() - mmToPixels(m_marginTop + m_marginBottom);
139  const qreal headerHeight = m_headers.height();
140  textDocHeight -= headerHeight;
141  textDocHeight -= mmToPixels(m_headerBodySpacing);
142  const qreal footerHeight = m_footers.height();
143  textDocHeight -= mmToPixels(m_footerBodySpacing);
144  textDocHeight -= footerHeight;
145  // qDebug() << "pageContent height (pixels): paper size" << m_paperSize.height() << "minus margins" << mmToPixels( m_marginTop + m_marginBottom )
146  // << "minus headerHeight" << headerHeight << "minus footerHeight" << footerHeight << "and spacings =" << textDocHeight;
147  return textDocHeight;
148 }
149 
151 {
152  const bool skip = rawMainTextDocHeight() <= 0;
153  if (skip) {
154  qDebug() << "Not enough height for headers and footers in this page size, hiding headers and footers.";
155  }
156  return skip;
157 }
158 
160 {
161  const qreal height = rawMainTextDocHeight();
162  const bool skip = height <= 0;
163  if (skip) {
164  qreal textDocHeight = paperSize().height() - mmToPixels(m_marginTop + m_marginBottom);
165  textDocHeight -= mmToPixels(m_headerBodySpacing);
166  textDocHeight -= mmToPixels(m_footerBodySpacing);
167  return textDocHeight;
168  }
169  return height;
170 }
171 
173 {
174  const int left = qRound(mmToPixels(m_marginLeft));
175  const int top = qRound(mmToPixels(m_marginTop));
176  const int headerHeightWithSpacing = qRound((skipHeadersFooters() ? 0 : m_headers.height()) + mmToPixels(m_headerBodySpacing));
177  const int textDocWidth = qRound(m_paperSize.width() - mmToPixels(m_marginLeft + m_marginRight));
178  const int textDocHeight = qRound(mainTextDocHeight());
179  return {left, top + headerHeightWithSpacing, textDocWidth, textDocHeight};
180 }
181 
182 /*
183  [top margin]
184  [header]
185  [m_headerBodySpacing]
186  [body]
187  [m_footerBodySpacing]
188  [footer]
189  [bottom margin]
190  */
192 {
193  Q_ASSERT(!wantEndlessPrinting()); // call ensureLayouted instead!
194 
195  m_paperSize = paperSize;
196  const qreal marginsInPixels = mmToPixels(m_marginLeft + m_marginRight);
197  qreal textDocWidth = m_paperSize.width() - marginsInPixels;
198 
199  m_headers.layoutWithTextWidth(textDocWidth);
200  m_footers.layoutWithTextWidth(textDocWidth);
201 
202  const qreal textDocHeight = mainTextDocHeight();
203 
204  // Font scaling
205  // Problem: how to re-implement this without a layout document?
206  // We would risk cumulating rounding problems...?
207  // ### 2nd problem: what about fonts in headers and footers? shouldn't they scale too?
208  // if ( m_scaleFontsBy != 1.0 )
209  // m_textDocument.scaleFontsBy( m_scaleFontsBy );
210 
211  m_layout->setPageContentSize(QSizeF(textDocWidth, textDocHeight));
212 
213  m_pageContentSizeDirty = false;
214 }
215 
216 KDReports::Header *KDReports::HeaderMap::headerForPage(int pageNumber /* 1-based */, int pageCount) const
217 {
218  Header *firstPageHeader = nullptr;
219  Header *lastPageHeader = nullptr;
220  Header *evenPagesHeader = nullptr;
221  Header *oddPagesHeader = nullptr;
222  for (const_iterator it = begin(); it != end(); ++it) {
223  const KDReports::HeaderLocations loc = it.key();
224  Header *const h = it.value();
225  if (loc & KDReports::FirstPage)
226  firstPageHeader = h;
227  if (loc & KDReports::LastPage)
228  lastPageHeader = h;
229  if (loc & KDReports::EvenPages)
230  evenPagesHeader = h;
231  if (loc & KDReports::OddPages)
232  oddPagesHeader = h;
233  }
234  if (pageNumber == 1 && firstPageHeader)
235  return firstPageHeader;
236  if (pageNumber == pageCount && lastPageHeader)
237  return lastPageHeader;
238  if (pageNumber & 1) // odd
239  return oddPagesHeader;
240  else // even
241  return evenPagesHeader;
242 }
243 
244 //@cond PRIVATE
245 KDReports::HeaderLocations KDReports::HeaderMap::headerLocation(Header *header) const
246 {
247  for (const_iterator it = begin(); it != end(); ++it) {
248  const KDReports::HeaderLocations loc = it.key();
249  Header *const h = it.value();
250  if (h == header) {
251  return loc;
252  }
253  }
254  KDReports::HeaderLocations loc;
255  return loc;
256 }
257 
258 void KDReports::ReportPrivate::paintPage(int pageNumber, QPainter &painter)
259 {
260  ensureLayouted();
261 
262  const int pageCount = m_layout->numberOfPages();
263  KDReports::Header *header = m_headers.headerForPage(pageNumber + 1, pageCount);
264  if (header) {
265  header->preparePaintingPage(pageNumber + m_firstPageNumber - 1);
266  }
267  KDReports::Header *footer = m_footers.headerForPage(pageNumber + 1, pageCount);
268  if (footer) {
269  footer->preparePaintingPage(pageNumber + m_firstPageNumber - 1);
270  }
271 
272  const QRect textDocRect = mainTextDocRect();
273  const bool skipHeadersFooters = this->skipHeadersFooters();
274 
275  /*qDebug() << "paintPage: in pixels: top=" << top << " headerHeight=" << headerHeightWithSpacing
276  << " textDoc size:" << textDocRect.size()
277  << " bottom=" << bottom << " footerHeight=" << footerHeight;*/
278 
279  if (!m_watermarkText.isEmpty()) {
280  painter.save();
281  painter.translate(textDocRect.center());
282  painter.rotate(m_watermarkRotation);
283  painter.setFont(m_watermarkFont);
284  painter.setPen(m_watermarkColor);
285  const QSize textSize(painter.fontMetrics().size(Qt::TextSingleLine, m_watermarkText));
286  const QRect textRect(-textSize.width() / 2, -textSize.height() / 2, textSize.width(), textSize.height());
287  painter.drawText(textRect, Qt::AlignCenter, m_watermarkText);
288  painter.restore();
289  }
290 
291  if (!m_watermarkImage.isNull()) {
292  // We paint it without scaling it, for better quality.
293  // But this means the actual size depends on the zoom level or printer resolution...
294  //
295  // It also means the image could end up being bigger than the page, and we don't want that.
296  // So we scale down if necessary. But never up.
297  QImage img = m_watermarkImage;
298  if (m_watermarkImage.width() > textDocRect.width() || m_watermarkImage.height() > textDocRect.height()) {
299  // should probably be cached?
300  img = m_watermarkImage.scaled(textDocRect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
301  }
302  const QRect imageRect = QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, img.size(), textDocRect);
303  // qDebug() << "textDocRect=" << textDocRect << "size=" << img.size() << "-> imageRect=" << imageRect;
304  painter.drawImage(imageRect.topLeft(), img);
305  }
306 
307  painter.save();
308  // painter.setClipRect( textDocRect, Qt::IntersectClip ); // triggers a Qt-Windows bug when printing
309  painter.setClipRect(textDocRect);
310  painter.translate(textDocRect.topLeft());
311  m_layout->paintPageContent(pageNumber, painter);
312  painter.restore();
313 
315  ctx.palette.setColor(QPalette::Text, Qt::black);
316  if (header && !skipHeadersFooters) {
317  painter.save();
318  const int top = qRound(mmToPixels(m_marginTop));
319  painter.translate(textDocRect.left(), top);
320  ctx.clip = painter.clipRegion().boundingRect();
321  header->doc().contentDocument().documentLayout()->draw(&painter, ctx);
322  painter.restore();
323  }
324  if (footer && !skipHeadersFooters) {
325  painter.save();
326  const int bottom = qRound(mmToPixels(m_marginBottom));
327  const int footerHeight = qRound(m_footers.height());
328  painter.translate(textDocRect.left(), m_paperSize.height() - bottom - footerHeight);
329  ctx.clip = painter.clipRegion().boundingRect();
330  footer->doc().contentDocument().documentLayout()->draw(&painter, ctx);
331  painter.restore();
332  }
333 }
334 //@endcond
335 
337 {
338  m_headers.layoutWithTextWidth(docWidth);
339  m_footers.layoutWithTextWidth(docWidth);
340 
341  const qreal docHeight = m_layout->layoutAsOnePage(docWidth);
342 
343  qreal pageWidth = docWidth + mmToPixels(m_marginLeft + m_marginRight);
344  qreal pageHeight = docHeight + mmToPixels(m_marginTop + m_marginBottom);
345  pageHeight += m_headers.height();
346  pageHeight += m_footers.height();
347 
348  m_pageContentSizeDirty = false;
349 
350  // qDebug() << "One-page document is" << pageWidth << "x" << pageHeight;
351  return QSizeF(pageWidth, pageHeight);
352 }
353 
355 {
356  m_pageContentSizeDirty = true;
357 }
358 
360 {
361  // caller has to ensure that we have been layouted for this printer already
362  const int pageCount = m_layout->numberOfPages();
363  std::unique_ptr<QProgressDialog> dialog;
364  if (QThread::currentThread() == qApp->thread()) {
365  dialog.reset(new QProgressDialog(QObject::tr("Printing"), QObject::tr("Cancel"), 0, pageCount, parent));
366  dialog->setWindowModality(Qt::ApplicationModal);
367  }
368  QPainter painter;
369  if (!painter.begin(printer)) {
370  qWarning() << "QPainter failed to initialize on the given printer";
371  return false;
372  }
373 
374  int fromPage = 0;
375  int toPage = pageCount;
376  if (printer->printRange() == QPrinter::PageRange) {
377  fromPage = printer->fromPage() - 1; // it starts at 1
378  toPage = printer->toPage(); // -1 because it starts at 1, and +1 because of '<'
379  if (toPage == 0)
380  toPage = pageCount;
381  }
382 
383  bool firstPage = true;
384  for (int pageIndex = fromPage; pageIndex < toPage; ++pageIndex) {
385  if (dialog) {
386  dialog->setValue(pageIndex);
387  if (dialog->wasCanceled())
388  break;
389  }
390 
391  if (!firstPage)
392  printer->newPage();
393 
394  paintPage(pageIndex, painter);
395  firstPage = false;
396  }
397 
398  return true;
399 }
400 
401 #ifndef NDEBUG
403 {
404  // for calling from gdb
405 
406  QFile html(QFile::decodeName(fileName) + QStringLiteral(".html"));
407  Q_ASSERT(html.open(QIODevice::WriteOnly));
408  const QString htmlText = m_layout->toHtml();
409  html.write(htmlText.toUtf8());
410  html.close();
411 
412  bool oldLayoutDirty = true;
413  m_pageContentSizeDirty = false;
414  QPrinter printer;
415  q->setupPrinter(&printer);
416  printer.setOutputFileName(QFile::decodeName(fileName));
417  doPrint(&printer, nullptr);
418  printer.setOutputFileName(QString());
419  m_pageContentSizeDirty = oldLayoutDirty;
420 }
421 #endif
422 
424 Q_GLOBAL_STATIC(ModelMap, globalModelMap)
425 
427 {
428  return globalModelMap()->value(key, 0);
429 }
430 
432 {
433  return paperSize().width() - mmToPixels(m_marginLeft + m_marginRight);
434 }
435 
437 {
438  if (m_reportMode == KDReports::Report::WordProcessing)
439  return static_cast<TextDocReportLayout *>(m_layout)->builder();
440  return nullptr;
441 }
442 
444 
446  : QObject(parent)
447  , d(new ReportPrivate(this))
448 {
450 }
451 
453 {
454 }
455 
457 {
458  if (d->m_reportMode != WordProcessing) {
459  qWarning("KDReports: addInlineElement is only supported in WordProcessing mode");
460  } else {
461  d->builder()->addInlineElementPublic(element);
462  // don't add anything else here, it won't be called from the xml parser
463  }
464 }
465 
466 void KDReports::Report::addElement(const Element &element, Qt::AlignmentFlag horizontalAlignment, const QColor &backgroundColor)
467 {
468  if (d->m_reportMode != WordProcessing) {
469  qWarning("KDReports: addElement is only supported in WordProcessing mode");
470  } else {
471  d->builder()->addBlockElementPublic(element, horizontalAlignment, backgroundColor);
472  // don't add anything else here, it won't be called from the xml parser
473  }
474 }
475 
477 {
478  if (d->m_reportMode != WordProcessing) {
479  qWarning("KDReports: addVerticalSpacing is only supported in WordProcessing mode");
480  } else {
481  d->builder()->addVerticalSpacingPublic(space);
482  }
483 }
484 
485 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
487 {
488  setPageSize(static_cast<QPageSize::PageSizeId>(size));
489 }
490 #endif
491 
493 {
494  setPageSize(QPageSize{size});
495 }
496 
498 {
499  d->m_pageSize = size;
500  d->m_paperSize = QSizeF();
501  d->m_pageContentSizeDirty = true;
502 }
503 
505 {
506  qreal factor = 1.0;
507  switch (unit) {
509  break;
511  factor = mmToPixels(1.0);
512  break;
513  case QPrinter::Point:
514  factor = 72.0 * qt_defaultDpi();
515  break;
516  case QPrinter::Inch:
517  factor = qt_defaultDpi();
518  break;
519  default:
520  qWarning("Unsupported printer unit %d", unit);
521  }
522  d->m_paperSize = QSizeF(paperSize.width() * factor, paperSize.height() * factor);
523  d->m_pageContentSizeDirty = true;
524 }
525 
526 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
528 {
529  return static_cast<QPrinter::PageSize>(d->m_pageSize.id());
530 }
531 #else
533 {
534  return d->m_pageSize;
535 }
536 #endif
537 
538 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
539 void KDReports::Report::setOrientation(QPrinter::Orientation orientation)
540 {
541  d->m_orientation = static_cast<QPageLayout::Orientation>(orientation);
542  d->m_paperSize = QSizeF();
543  d->m_pageContentSizeDirty = true;
544 }
545 
546 QPrinter::Orientation KDReports::Report::orientation() const
547 {
548  return static_cast<QPrinter::Orientation>(d->m_orientation);
549 }
550 #endif
551 
553 {
554  d->m_orientation = orientation;
555  d->m_paperSize = QSizeF();
556  d->m_pageContentSizeDirty = true;
557 }
558 
560 {
561  return d->m_orientation;
562 }
563 
564 void KDReports::Report::setMargins(qreal top, qreal left, qreal bottom, qreal right)
565 {
566  d->m_marginTop = top;
567  d->m_marginLeft = left;
568  d->m_marginBottom = bottom;
569  d->m_marginRight = right;
570 
571  // We'll need to call setPaperSizeFromPrinter, to update % sizes in all text documents.
572  d->m_pageContentSizeDirty = true;
573 }
574 
575 void KDReports::Report::getMargins(qreal *top, qreal *left, qreal *bottom, qreal *right) const
576 {
577  *top = d->m_marginTop;
578  *left = d->m_marginLeft;
579  *bottom = d->m_marginBottom;
580  *right = d->m_marginRight;
581 }
582 
584 {
585  d->m_marginLeft = left;
586 
587  // We'll need to call setPaperSizeFromPrinter, to update % sizes in all text documents.
588  d->m_pageContentSizeDirty = true;
589 }
590 
592 {
593  return d->m_marginLeft;
594 }
595 
597 {
598  d->m_marginRight = right;
599 
600  // We'll need to call setPaperSizeFromPrinter, to update % sizes in all text documents.
601  d->m_pageContentSizeDirty = true;
602 }
603 
605 {
606  return d->m_marginRight;
607 }
608 
610 {
611  d->m_marginTop = top;
612 
613  // We'll need to call setPaperSizeFromPrinter, to update % sizes in all text documents.
614  d->m_pageContentSizeDirty = true;
615 }
616 
618 {
619  return d->m_marginTop;
620 }
621 
623 {
624  d->m_marginBottom = bottom;
625 
626  // We'll need to call setPaperSizeFromPrinter, to update % sizes in all text documents.
627  d->m_pageContentSizeDirty = true;
628 }
629 
631 {
632  return d->m_marginBottom;
633 }
634 
636 {
637  if (widthMM) {
638  d->m_endlessPrinterWidth = widthMM;
639  d->m_layoutWidth = mmToPixels(widthMM);
640  d->m_pageContentSizeDirty = true;
641  d->ensureLayouted();
642  } else {
643  d->m_layoutWidth = 0;
644  d->m_pageContentSizeDirty = true;
645  // caller will call setPageSize...
646  }
647 }
648 
649 void KDReports::Report::paintPage(int pageNumber, QPainter &painter)
650 {
651  d->paintPage(pageNumber, painter);
652 }
653 
655 {
656  d->ensureLayouted();
657  return d->m_layout->numberOfPages();
658 }
659 
661 {
662  qDebug() << asHtml();
663 }
664 
665 QString KDReports::Report::asHtml() const
666 {
667  return d->m_layout->toHtml();
668 }
669 
671 {
672  QPrinter printer;
673  setupPrinter(&printer);
674  QPointer<QPrintDialog> dialog = new QPrintDialog(&printer, parent);
675  dialog->setMinMax(1, numberOfPages());
676  bool ok = false;
677  if (dialog->exec() == QDialog::Accepted) {
678  // Well, the user can modify the page size in the printer dialog too - ensure layout matches
679  d->ensureLayouted();
680  ok = d->doPrint(&printer, parent);
681  }
682  delete dialog;
683  return ok;
684 }
685 
687 {
688  // save the old page size
689  const auto savePageSize = pageSize();
690  if (d->wantEndlessPrinting()) {
691  // ensure that the printer is set up with the right size
692  d->ensureLayouted();
693  // was: printer->setPaperSize(d->m_paperSize, QPrinter::DevicePixel);
694  printer->setPageSize(QPageSize(d->m_paperSize * pixelsToPointsMultiplier(printer->resolution()), QPageSize::Point));
695 
696  } else {
697  // ensure that the layout matches the printer
698  d->setPaperSizeFromPrinter(printer->pageLayout().fullRectPixels(printer->resolution()).size());
699  }
700 
701  printer->setFullPage(true);
702 
703  // don't call ensureLayouted here, it would use the wrong printer!
704 
705  const bool ret = d->doPrint(printer, parent);
706 
707  // Reset the page size
708  setPageSize(savePageSize);
709 
710  return ret;
711 }
712 
713 bool KDReports::Report::exportToFile(const QString &fileName, QWidget *parent)
714 {
715  d->ensureLayouted();
716  QPrinter printer;
717  printer.setOutputFileName(fileName); // must be done before setupPrinter, since it affects DPI
718  setupPrinter(&printer);
719  const bool ret = d->doPrint(&printer, parent);
720  printer.setOutputFileName(QString());
721  return ret;
722 }
723 
725 {
726  const QString html = asHtml();
727  QFile file(fileName);
728  if (file.open(QIODevice::WriteOnly)) {
729  file.write(html.toUtf8());
730  d->m_layout->finishHtmlExport();
731  return true;
732  }
733  return false;
734 }
735 
736 bool KDReports::Report::exportToImage(QSize size, const QString &fileName, const char *format)
737 {
738  // Get the document to fit into one page
739 
740  const auto savePageSize = pageSize();
741  const qreal saveLayoutWidth = d->m_layoutWidth;
742  d->m_layoutWidth = d->m_layout->idealWidth() + mmToPixels(d->m_marginLeft + d->m_marginRight);
743  d->m_pageContentSizeDirty = true;
744  d->ensureLayouted();
745 
746  const qreal zoomFactor = qMin((qreal)size.width() / d->m_paperSize.width(), (qreal)size.height() / d->m_paperSize.height());
747  // qDebug() << "zoomFactor=" << zoomFactor;
748 
750  image.fill(Qt::white);
751 
752  QPainter painter;
753  if (!painter.begin(&image)) {
754  qWarning() << "QPainter failed to initialize on the given image of size" << size;
755  return false;
756  }
759  painter.fillRect(QRectF(0, 0, size.width(), size.height()), QBrush(Qt::white));
760  painter.scale(zoomFactor, zoomFactor);
761  d->paintPage(0, painter);
762 
763  // restore textdoc size and header widths
764  d->m_layoutWidth = saveLayoutWidth;
765  setPageSize(savePageSize); // redo layout
766  qDebug() << "Saving pixmap" << image.size() << "into" << fileName << "with format" << format;
767  return image.save(fileName, format);
768 }
769 
771 {
772  if (!d->m_headers.contains(hl))
773  d->m_headers.insert(hl, new Header(this));
774  return *d->m_headers.value(hl);
775 }
776 
777 void KDReports::Report::setHeaderLocation(HeaderLocations hl, Header *header)
778 {
779  // Remove old entry for this header
780  HeaderLocations loc = d->m_headers.headerLocation(header);
781  d->m_headers.remove(loc);
782  d->m_headers.insert(hl, header);
783 }
784 
786 {
787  if (!d->m_footers.contains(hl))
788  d->m_footers.insert(hl, new Header(this));
789  return *d->m_footers.value(hl);
790 }
791 
792 void KDReports::Report::setFooterLocation(HeaderLocations hl, Footer *footer)
793 {
794  // Remove old entry for this header
795  HeaderLocations loc = d->m_footers.headerLocation(footer);
796  d->m_footers.remove(loc);
797  d->m_footers.insert(hl, footer);
798 }
799 
801 {
802  QDomDocument doc;
803  // Read document from the QIODevice, check for errors
804 
805  // We need to be able to see the space in <text> </text>, this is why
806  // we activate the "report-whitespace-only-CharData" feature.
807  // Unfortunately this leads to lots of whitespace text nodes in between real
808  // elements in the rest of the document, watch out for that.
809  if (iodevice->isOpen())
810  iodevice->reset(); // need to do that to allow consecutive calls of loadFromXML()
811  else
812  iodevice->open(QIODevice::ReadOnly);
813 
814  QString errorMsg;
815  int errorLine = 0;
816  int errorColumn = 0;
817  bool ret = doc.setContent(iodevice, true, &errorMsg, &errorLine, &errorColumn);
818  if (!ret) {
819  if (details) {
820  details->setLine(errorLine);
821  details->setColumn(errorColumn);
822  details->setDriverMessage(errorMsg);
823  } else
824  qWarning("Malformed XML read in KDReports::Report::loadFromXML(): error message = %s, error line = %d, error column = %d", qPrintable(errorMsg), errorLine, errorColumn);
825  return false;
826  }
827  return loadFromXML(doc, details);
828 }
829 
831 {
832  XmlParser parser(d->m_textValues, d->m_imageValues, d->m_xmlElementHandler, this, details);
833  d->m_pageContentSizeDirty = true;
834  return parser.processDocument(doc, d->builder());
835 }
836 
838 {
839  globalModelMap()->insert(modelKey, model);
840 }
841 
842 KDReports::TextDocument &KDReports::Report::doc() const
843 {
844  Q_ASSERT(d->m_reportMode == WordProcessing);
845  return static_cast<TextDocReportLayout *>(d->m_layout)->textDocument();
846 }
847 
849 {
850  d->builder()->contentDocumentCursor().beginEditBlock();
851 }
852 
854 {
855  d->builder()->contentDocumentCursor().endEditBlock();
856 }
857 
858 QString KDReports::Report::anchorAt(int pageNumber, QPoint pos) const
859 {
860  const QRect textDocRect = d->mainTextDocRect();
861  const QPoint textPos = pos - textDocRect.topLeft();
862  return d->m_layout->anchorAt(pageNumber, textPos);
863 }
864 
866 {
867  if (d->m_reportMode == WordProcessing) {
868  return &static_cast<TextDocReportLayout *>(d->m_layout)->textDocument().contentDocument();
869  } else {
870  return nullptr;
871  }
872 }
873 
874 void KDReports::Report::setWatermarkText(const QString &text, int rotation, const QColor &color, const QFont &font)
875 {
876  d->m_watermarkText = text;
877  d->m_watermarkRotation = rotation;
878  d->m_watermarkColor = color;
879  d->m_watermarkFont = font;
880 }
881 
883 {
884  return d->m_watermarkText;
885 }
886 
888 {
889  return d->m_watermarkRotation;
890 }
891 
893 {
894  return d->m_watermarkColor;
895 }
896 
898 {
899  return d->m_watermarkFont;
900 }
901 
902 void KDReports::Report::setWatermarkPixmap(const QPixmap &pixmap, bool autoGrayOut)
903 {
904  QPixmap pix(pixmap);
905  if (autoGrayOut) {
906  QStyleOption opt(0);
907  opt.palette = QApplication::palette();
908  pix = qApp->style()->generatedIconPixmap(QIcon::Disabled, pixmap, &opt);
909  }
910  setWatermarkImage(pix.toImage());
911 }
912 
914 {
915  return QPixmap::fromImage(d->m_watermarkImage);
916 }
917 
919 {
920  d->m_watermarkImage = image;
921 }
922 
924 {
925  return d->m_watermarkImage;
926 }
927 
929 {
930  d->builder()->addPageBreakPublic();
931 }
932 
934 {
935  d->m_layout->updateTextValue(id, value); // in case the document is built already
936  d->m_headers.updateTextValue(id, value);
937  d->m_footers.updateTextValue(id, value);
938  d->m_textValues.insert(id, value); // in case the document isn't built yet
939 }
940 
942 {
943  d->m_imageValues.insert(id, value.toImage());
944 }
945 
947 {
948  d->m_imageValues.insert(id, value);
949 }
950 
952 {
953  return d->paperSize();
954 }
955 
957 {
958  d->builder()->insertFragmentPublic(fragment);
959 }
960 
962 {
963  d->m_layout->setDefaultFont(font);
964  d->m_pageContentSizeDirty = true;
965 }
966 
968 {
969  return d->m_layout->defaultFont();
970 }
971 
973 {
974  d->m_headerBodySpacing = spacing;
975  d->m_pageContentSizeDirty = true;
976 }
977 
979 {
980  return d->m_headerBodySpacing;
981 }
982 
984 {
985  d->m_footerBodySpacing = spacing;
986  d->m_pageContentSizeDirty = true;
987 }
988 
990 {
991  return d->m_footerBodySpacing;
992 }
993 
994 void KDReports::Report::scaleTo(int numPagesHorizontally, int numPagesVertically)
995 {
996  d->m_layout->scaleTo(numPagesHorizontally, numPagesVertically);
997 }
998 
1000 {
1001  return d->m_layout->maximumNumberOfPagesForHorizontalScaling();
1002 }
1003 
1005 {
1006  return d->m_layout->maximumNumberOfPagesForVerticalScaling();
1007 }
1008 
1010 {
1011  d->m_layout->setFixedRowHeight(mmToPixels(mm));
1012 }
1013 
1015 {
1016  d->m_layout->setUserRequestedFontScalingFactor(factor);
1017 }
1018 
1020 {
1021  return d->m_layout->userRequestedFontScalingFactor();
1022 }
1023 
1025 {
1026  return maximumNumberOfPagesForHorizontalScaling() != 1 || maximumNumberOfPagesForVerticalScaling() > 0;
1027 }
1028 
1030 {
1031  if (d->m_reportMode != SpreadSheet) {
1032  qWarning("setTableBreakingPageOrder is only supported in SpreadSheet mode");
1033  } else {
1034  mainTable()->setTableBreakingPageOrder(pageOrder);
1035  }
1036 }
1037 
1039 {
1040  if (d->m_reportMode != SpreadSheet) {
1041  qWarning("tableBreakingPageOrder is only supported in SpreadSheet mode");
1042  return DownThenRight;
1043  } else {
1044  return mainTable()->tableBreakingPageOrder();
1045  }
1046 }
1047 
1049 {
1050  if (d->m_reportMode == WordProcessing)
1051  doc().regenerateAutoTables();
1052 }
1053 
1055 {
1056  if (d->m_reportMode == WordProcessing)
1057  doc().regenerateAutoTableForModel(model);
1058 }
1059 
1061 {
1062  if (d->m_reportMode == WordProcessing)
1063  return doc().autoTableElements();
1064  return {};
1065 }
1066 
1068 {
1069  d->m_xmlElementHandler = handler;
1070 }
1071 
1073 {
1074  d->m_currentModel = model;
1075  d->m_currentRow = row;
1076 }
1077 
1079 {
1080  d->m_documentName = name;
1081 }
1082 
1084 {
1085  return d->m_documentName;
1086 }
1087 
1089 {
1090  d->builder()->setTabPositions(tabs);
1091 }
1092 
1093 void KDReports::Report::setParagraphMargins(qreal left, qreal top, qreal right, qreal bottom)
1094 {
1095  d->builder()->setParagraphMargins(left, top, right, bottom);
1096 }
1097 
1099 {
1100  if (d->m_reportMode != reportMode) {
1101  d->m_reportMode = reportMode;
1102  delete d->m_layout;
1103  switch (reportMode) {
1104  case WordProcessing:
1105  d->m_layout = new TextDocReportLayout(this);
1106  break;
1107  case SpreadSheet:
1108  auto *sslayout = new SpreadsheetReportLayout(this);
1109  d->m_layout = sslayout;
1110  mainTable()->setLayout(sslayout);
1111  break;
1112  };
1113  }
1114 }
1115 
1117 {
1118  return d->m_reportMode;
1119 }
1120 
1122 {
1123  Q_ASSERT(d->m_reportMode == SpreadSheet);
1124  return d->m_mainTable;
1125 }
1126 
1128 {
1129  QTextOption::Tab tab;
1130  tab.position = -1;
1131  tab.type = QTextOption::RightTab;
1132  tab.delimiter = QChar::fromLatin1('P'); // a bit hackish, but this is how we tell TextDocumentData::updatePercentSize
1133  return tab;
1134 }
1135 
1137 {
1138  QTextOption::Tab tab;
1139  tab.position = -1;
1140  tab.type = QTextOption::CenterTab;
1141  tab.delimiter = QChar::fromLatin1('P'); // a bit hackish, but this is how we tell TextDocumentData::updatePercentSize
1142  return tab;
1143 }
1144 
1145 KDReports::HeaderLocations KDReports::Report::headerLocation(KDReports::Header *header) const
1146 {
1147  return d->m_headers.headerLocation(header);
1148 }
1149 
1150 KDReports::HeaderLocations KDReports::Report::footerLocation(KDReports::Footer *footer) const
1151 {
1152  return d->m_footers.headerLocation(footer);
1153 }
1154 
1156 {
1157  return d->builder()->currentPosition();
1158 }
1159 
1161 {
1162  d->m_firstPageNumber = num;
1163 }
1164 
1166 {
1167  return d->m_firstPageNumber;
1168 }
1169 
1170 void KDReports::Report::setupPrinter(QPrinter *printer)
1171 {
1172  printer->setFullPage(true);
1173  printer->setPageOrientation(d->m_orientation);
1174  // was: printer->setPaperSize(rawPaperSize(d->m_pageSize, printer), QPrinter::DevicePixel);
1175  printer->setPageSize(d->m_pageSize);
1176  printer->setDocName(d->m_documentName);
1177 }
QPainter::Antialiasing
Antialiasing
KDReports::Report::anchorAt
QString anchorAt(int pageNumber, QPoint pos) const
Definition: KDReportsReport.cpp:858
QTextDocument
QPointer
QColor
QPrinter::fromPage
int fromPage() const const
QTextDocumentFragment
KDReports::ReportPrivate::headerChanged
void headerChanged()
Definition: KDReportsReport.cpp:354
Qt::AlignCenter
AlignCenter
KDReports::ReportBuilder
Definition: KDReportsReportBuilder_p.h:42
QSizeF::height
qreal height() const const
KDReports::Report::setFooterLocation
void setFooterLocation(HeaderLocations hl, Footer *footer)
Definition: KDReportsReport.cpp:792
KDReports::ErrorDetails::setLine
void setLine(int line)
Definition: KDReportsErrorDetails.cpp:65
QPainter::setPen
void setPen(const QColor &color)
KDReports::Report::associateImageValue
void associateImageValue(const QString &id, const QPixmap &value)
Definition: KDReportsReport.cpp:941
QPixmap::fromImage
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
KDReports::ReportPrivate::paintPage
void paintPage(int pageNumber, QPainter &painter)
KDReports::Report::setHeaderBodySpacing
void setHeaderBodySpacing(qreal spacing)
Definition: KDReportsReport.cpp:972
KDReports::Report::watermarkFont
QFont watermarkFont() const
Definition: KDReportsReport.cpp:897
QRect::topLeft
QPoint topLeft() const const
KDReports::Report::setWatermarkText
void setWatermarkText(const QString &text, int rotation=0, const QColor &color=QColor(204, 204, 204), const QFont &font=QFont(QStringLiteral("Helvetica"), 48))
Definition: KDReportsReport.cpp:874
QImage::Format_ARGB32_Premultiplied
Format_ARGB32_Premultiplied
QIODevice::WriteOnly
WriteOnly
KDReports::Report::regenerateAutoTableForModel
void regenerateAutoTableForModel(QAbstractItemModel *model)
Definition: KDReportsReport.cpp:1054
QTextOption::Tab
QRegion::boundingRect
QRect boundingRect() const const
QRect::size
QSize size() const const
QImage::fill
void fill(uint pixelValue)
QTextOption::RightTab
RightTab
KDReports::XmlParser
Definition: KDReportsXmlParser_p.h:53
QPalette::Text
Text
QPainter::rotate
void rotate(qreal angle)
KDReports::Report::setWatermarkPixmap
void setWatermarkPixmap(const QPixmap &pixmap, bool autoGrayOut=true)
Definition: KDReportsReport.cpp:902
QRect
KDReports::Report::setDefaultFont
void setDefaultFont(const QFont &font)
Definition: KDReportsReport.cpp:961
KDReports::modelForKey
QAbstractItemModel * modelForKey(const QString &key)
Definition: KDReportsReport.cpp:426
QFile::open
virtual bool open(QIODevice::OpenMode mode) override
KDReports::Report::beginEdit
void beginEdit()
Definition: KDReportsReport.cpp:848
KDReportsSpreadsheetReportLayout_p.h
KDReports::Report::setTableBreakingPageOrder
void setTableBreakingPageOrder(TableBreakingPageOrder pageOrder)
Definition: KDReportsReport.cpp:1029
KDReports::Report::pageOrientation
QPageLayout::Orientation pageOrientation() const
Definition: KDReportsReport.cpp:559
KDReports::Report::loadFromXML
bool loadFromXML(QIODevice *iodevice, ErrorDetails *details=nullptr)
Definition: KDReportsReport.cpp:800
QIODevice
Qt::ApplicationModal
ApplicationModal
QPainter::setClipRect
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
KDReports::ReportPrivate::~ReportPrivate
~ReportPrivate()
Definition: KDReportsReport.cpp:86
Qt::TextSingleLine
TextSingleLine
KDReports::Report::footerLocation
KDReports::HeaderLocations footerLocation(KDReports::Footer *footer) const
Definition: KDReportsReport.cpp:1150
KDReports::Report::addPageBreak
void addPageBreak()
Definition: KDReportsReport.cpp:928
QTextDocument::documentLayout
QAbstractTextDocumentLayout * documentLayout() const const
KDReportsMainTable.h
QWidget
KDReports::Report::setReportMode
void setReportMode(ReportMode reportMode)
Definition: KDReportsReport.cpp:1098
KDReports::Report::paintPage
void paintPage(int pageNumber, QPainter &painter)
Definition: KDReportsReport.cpp:649
QIODevice::open
virtual bool open(QIODevice::OpenMode mode)
QRect::width
int width() const const
KDReports::Report::headerLocation
KDReports::HeaderLocations headerLocation(Header *header) const
Definition: KDReportsReport.cpp:1145
QImage::scaled
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const const
QPageLayout
QSize
KDReports::Report::setFontScalingFactor
void setFontScalingFactor(qreal factor)
Scale the fonts in the document by a given factor.
Definition: KDReportsReport.cpp:1014
KDReportsReport_p.h
QPrinter::setPageSize
bool setPageSize(const QPageSize &pageSize)
QDomDocument::setContent
bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
KDReports::Report::setHeaderLocation
void setHeaderLocation(HeaderLocations hl, Header *header)
Definition: KDReportsReport.cpp:777
QPrinter::printRange
QPrinter::PrintRange printRange() const const
KDReportsTextDocReportLayout_p.h
KDReports::Report::topPageMargins
qreal topPageMargins() const
Definition: KDReportsReport.cpp:617
KDReports::Report::addInlineElement
void addInlineElement(const Element &element)
Definition: KDReportsReport.cpp:456
KDReports::Report::exportToImage
bool exportToImage(QSize size, const QString &fileName, const char *format)
Definition: KDReportsReport.cpp:736
KDReports::Report::print
bool print(QPrinter *printer, QWidget *parent=nullptr)
Definition: KDReportsReport.cpp:686
QPageLayout::fullRectPixels
QRect fullRectPixels(int resolution) const const
QSize::width
int width() const const
KDReports::Report::regenerateAutoTables
void regenerateAutoTables()
Definition: KDReportsReport.cpp:1048
KDReports::Report::endEdit
void endEdit()
Definition: KDReportsReport.cpp:853
KDReports::Report::setBottomPageMargin
void setBottomPageMargin(qreal bottom)
Definition: KDReportsReport.cpp:622
KDReports::Report::mainTextDocument
QTextDocument * mainTextDocument() const
Definition: KDReportsReport.cpp:865
KDReports::FirstPage
@ FirstPage
The first page of the report.
Definition: KDReportsReport.h:63
QList
KDReports::Report::setMargins
void setMargins(qreal top, qreal left, qreal bottom, qreal right)
Definition: KDReportsReport.cpp:564
QPainter
QPainter::drawText
void drawText(const QPointF &position, const QString &text)
KDReports::Element
Definition: KDReportsElement.h:41
QPainter::fillRect
void fillRect(const QRectF &rectangle, const QBrush &brush)
KDReports::Report::watermarkColor
QColor watermarkColor() const
Definition: KDReportsReport.cpp:892
QObject::thread
QThread * thread() const const
KDReports::TextDocument::contentDocument
QTextDocument & contentDocument()
Definition: KDReportsTextDocument.cpp:43
KDReports::ReportPrivate::builder
ReportBuilder * builder() const
Definition: KDReportsReport.cpp:436
QRect::left
int left() const const
QPainter::drawImage
void drawImage(const QRectF &target, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags)
KDReports::Report::maximumNumberOfPagesForVerticalScaling
int maximumNumberOfPagesForVerticalScaling() const
Definition: KDReportsReport.cpp:1004
KDReports::Report::exportToFile
bool exportToFile(const QString &fileName, QWidget *parent=nullptr)
Definition: KDReportsReport.cpp:713
QPagedPaintDevice::PageSize
PageSize
QAbstractTextDocumentLayout::PaintContext
KDReports::Report::setCurrentRow
void setCurrentRow(const QAbstractItemModel *model, int row)
Definition: KDReportsReport.cpp:1072
QPainter::begin
bool begin(QPaintDevice *device)
KDReports::Report::middleAlignedTab
static QTextOption::Tab middleAlignedTab()
Definition: KDReportsReport.cpp:1136
QPrinter::setDocName
void setDocName(const QString &name)
KDReports::ReportPrivate::debugLayoutToPdf
void debugLayoutToPdf(const char *fileName)
Definition: KDReportsReport.cpp:402
KDReports::ErrorDetails::setColumn
void setColumn(int column)
Definition: KDReportsErrorDetails.cpp:71
QPixmap
KDReports::ReportPrivate
Definition: KDReportsReport_p.h:94
ModelMap
QMap< QString, QAbstractItemModel * > ModelMap
Definition: KDReportsReport.cpp:423
KDReports::Report::setLeftPageMargin
void setLeftPageMargin(qreal left)
Definition: KDReportsReport.cpp:583
KDReports::XmlElementHandler
Definition: KDReportsXmlElementHandler.h:85
KDReports::Report
Definition: KDReportsReport.h:81
QPrinter::setPageOrientation
bool setPageOrientation(QPageLayout::Orientation orientation)
Qt::KeepAspectRatio
KeepAspectRatio
KDReportsXmlParser_p.h
QPrinter::resolution
int resolution() const const
KDReportsElement.h
QPrinter::toPage
int toPage() const const
KDReports::Report::watermarkImage
QImage watermarkImage() const
Definition: KDReportsReport.cpp:923
QObject
KDReports::Report::documentName
QString documentName
Definition: KDReportsReport.h:83
KDReports::TextDocument
Definition: KDReportsTextDocument_p.h:56
QProgressDialog
KDReports::ReportPrivate::doPrint
bool doPrint(QPrinter *printer, QWidget *parent)
Definition: KDReportsReport.cpp:359
QSize::height
int height() const const
QPainter::scale
void scale(qreal sx, qreal sy)
KDReports::Report::setWatermarkImage
void setWatermarkImage(const QImage &image)
Definition: KDReportsReport.cpp:918
KDReports::Report::getMargins
void getMargins(qreal *top, qreal *left, qreal *bottom, qreal *right) const
Definition: KDReportsReport.cpp:575
KDReports::Report::firstPageNumber
int firstPageNumber() const
Definition: KDReportsReport.cpp:1165
QString
KDReports::TextDocReportLayout
Definition: KDReportsTextDocReportLayout_p.h:27
KDReports::Report::setXmlElementHandler
void setXmlElementHandler(KDReports::XmlElementHandler *handler)
Definition: KDReportsReport.cpp:1067
QIODevice::isOpen
bool isOpen() const const
KDReportsReport.h
KDReports::ReportPrivate::mainTextDocHeight
qreal mainTextDocHeight() const
Definition: KDReportsReport.cpp:159
QPrinter::PageRange
PageRange
KDReportsHeader.h
QString::toUtf8
QByteArray toUtf8() const const
KDReports::ReportPrivate::mainTextDocRect
QRect mainTextDocRect() const
Definition: KDReportsReport.cpp:172
QPageLayout::Landscape
Landscape
KDReports::EvenPages
@ EvenPages
The even pages of the report: 2, 4, 6 etc.
Definition: KDReportsReport.h:64
QThread::currentThread
QThread * currentThread()
QPainter::fontMetrics
QFontMetrics fontMetrics() const const
KDReports::Report::exportToHtml
bool exportToHtml(const QString &fileName)
Definition: KDReportsReport.cpp:724
QPageSize::A4
A4
KDReports::OddPages
@ OddPages
The odd pages of the report: 1 (unless FirstPage has its own header), 3, 5, 7 etc.
Definition: KDReportsReport.h:65
KDReports::ReportPrivate::skipHeadersFooters
bool skipHeadersFooters() const
Definition: KDReportsReport.cpp:150
KDReports::Report::~Report
~Report() override
Definition: KDReportsReport.cpp:452
QRect::center
QPoint center() const const
KDReports::SpreadsheetReportLayout
Definition: KDReportsSpreadsheetReportLayout_p.h:30
KDReports::Report::setPaperSize
void setPaperSize(QSizeF paperSize, QPrinter::Unit unit)
Definition: KDReportsReport.cpp:504
KDReports::Report::watermarkText
QString watermarkText() const
Definition: KDReportsReport.cpp:882
KDReports::Report::footerBodySpacing
qreal footerBodySpacing() const
Definition: KDReportsReport.cpp:989
QImage::size
QSize size() const const
QDialog::Accepted
Accepted
QFileDevice::close
virtual void close() override
QIcon::Disabled
Disabled
QStyleOption
qt_defaultDpi
QT_BEGIN_NAMESPACE Q_GUI_EXPORT int qt_defaultDpi()
KDReports::Report::numberOfPages
int numberOfPages() const
Definition: KDReportsReport.cpp:654
QStyle::alignedRect
QRect alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment, const QSize &size, const QRect &rectangle)
QFontMetrics::size
QSize size(int flags, const QString &text, int tabStops, int *tabArray) const const
QPixmap::toImage
QImage toImage() const const
QBrush
KDReports::Report::leftPageMargins
qreal leftPageMargins() const
Definition: KDReportsReport.cpp:591
KDReports::Report::setRightPageMargin
void setRightPageMargin(qreal right)
Definition: KDReportsReport.cpp:596
KDReports::Report::watermarkPixmap
QPixmap watermarkPixmap() const
Definition: KDReportsReport.cpp:913
KDReports::ReportPrivate::ReportPrivate
ReportPrivate(Report *report)
Definition: KDReportsReport.cpp:48
QPrinter::Unit
Unit
KDReports::HeaderMap::headerForPage
Header * headerForPage(int pageNumber, int pageCount) const
Definition: KDReportsReport.cpp:216
KDReports::LastPage
@ LastPage
The last page of the report.
Definition: KDReportsReport.h:66
KDReports::Report::Report
Report(QObject *parent=nullptr)
Definition: KDReportsReport.cpp:445
KDReports::Report::setPageOrientation
void setPageOrientation(QPageLayout::Orientation orientation)
Definition: KDReportsReport.cpp:552
KDReports::ReportPrivate::paperSize
QSizeF paperSize() const
Definition: KDReportsReport.cpp:97
KDReports::Report::setTabPositions
void setTabPositions(const QList< QTextOption::Tab > &tabs)
Definition: KDReportsReport.cpp:1088
KDReports::ReportPrivate::textDocumentWidth
qreal textDocumentWidth() const
Definition: KDReportsReport.cpp:431
KDReports::Report::addFragment
void addFragment(const QTextDocumentFragment &fragment)
Definition: KDReportsReport.cpp:956
KDReports::Report::addVerticalSpacing
void addVerticalSpacing(qreal space)
Definition: KDReportsReport.cpp:476
KDReports::Report::mainTable
MainTable * mainTable() const
Definition: KDReportsReport.cpp:1121
QMap
KDReports::ReportPrivate::layoutAsOnePage
QSizeF layoutAsOnePage(qreal docWidth)
Definition: KDReportsReport.cpp:336
KDReports::Report::tableBreakingPageOrder
TableBreakingPageOrder tableBreakingPageOrder() const
Definition: KDReportsReport.cpp:1038
KDReports::Report::addElement
void addElement(const Element &element, Qt::AlignmentFlag horizontalAlignment=Qt::AlignLeft, const QColor &backgroundColor=QColor())
Definition: KDReportsReport.cpp:466
KDReports::Report::watermarkRotation
int watermarkRotation() const
Definition: KDReportsReport.cpp:887
KDReports::Report::setTopPageMargin
void setTopPageMargin(qreal top)
Definition: KDReportsReport.cpp:609
KDReports::Report::scaleTo
void scaleTo(int numPagesHorizontally, int numPagesVertically)
Ensure that the report fits into a number of pages.
Definition: KDReportsReport.cpp:994
QRect::height
int height() const const
QPrinter::newPage
virtual bool newPage() override
QPrinter::setOutputFileName
void setOutputFileName(const QString &fileName)
KDReports::mmToPixels
KDREPORTS_EXPORT qreal mmToPixels(qreal mm)
Definition: KDReportsLayoutHelper.cpp:23
KDReports::Report::isTableBreakingEnabled
bool isTableBreakingEnabled() const
Definition: KDReportsReport.cpp:1024
KDReports::Report::WordProcessing
@ WordProcessing
Definition: KDReportsReport.h:96
KDReports::Report::pageSize
QPageSize pageSize() const
Definition: KDReportsReport.cpp:532
KDReports::Report::currentPosition
int currentPosition() const
Definition: KDReportsReport.cpp:1155
KDReports::Report::headerBodySpacing
qreal headerBodySpacing() const
Definition: KDReportsReport.cpp:978
KDReports::Report::paperSize
QSizeF paperSize() const
Definition: KDReportsReport.cpp:951
KDReportsLayoutHelper_p.h
QPrinter::setFullPage
void setFullPage(bool fp)
QPainter::clipRegion
QRegion clipRegion() const const
KDReports::HeaderMap::headerLocation
KDReports::HeaderLocations headerLocation(Header *header) const
QSizeF
KDReports::XmlParser::processDocument
bool processDocument(const QDomDocument &document, KDReports::ReportBuilder *builder)
Definition: KDReportsXmlParser.cpp:147
KDReports::Report::associateModel
void associateModel(const QString &modelKey, QAbstractItemModel *model)
Definition: KDReportsReport.cpp:837
Qt::LeftToRight
LeftToRight
QPrinter::pageLayout
QPageLayout pageLayout() const const
QPainter::translate
void translate(const QPointF &offset)
QRectF
KDReports::Report::footer
Footer & footer(HeaderLocations hl=AllPages)
Definition: KDReportsReport.cpp:785
KDReports::Report::setDocumentName
void setDocumentName(const QString &name)
Definition: KDReportsReport.cpp:1078
KDReports::Report::ReportMode
ReportMode
Definition: KDReportsReport.h:96
KDReports::Report::rightAlignedTab
static QTextOption::Tab rightAlignedTab()
Definition: KDReportsReport.cpp:1127
QPainter::restore
void restore()
KDReports::MainTable
Definition: KDReportsMainTable.h:44
QPageSize::Millimeter
Millimeter
KDReports::Report::associateTextValue
void associateTextValue(const QString &id, const QString &value)
Definition: KDReportsReport.cpp:933
KDReports::Report::bottomPageMargins
qreal bottomPageMargins() const
Definition: KDReportsReport.cpp:630
KDReports::ReportPrivate::setPaperSizeFromPrinter
void setPaperSizeFromPrinter(QSizeF paperSize)
Definition: KDReportsReport.cpp:191
KDReports::Report::dump
void dump() const
Definition: KDReportsReport.cpp:660
QGuiApplication::palette
QPalette palette()
QPainter::save
void save()
KDReports::Report::setFixedRowHeight
void setFixedRowHeight(qreal mm)
Definition: KDReportsReport.cpp:1009
KDReports::Report::printWithDialog
bool printWithDialog(QWidget *parent)
Definition: KDReportsReport.cpp:670
KDReports::Report::rightPageMargins
qreal rightPageMargins() const
Definition: KDReportsReport.cpp:604
KDReports::ErrorDetails
Definition: KDReportsErrorDetails.h:32
QDomDocument
KDReports::Report::setParagraphMargins
void setParagraphMargins(qreal left, qreal top, qreal right, qreal bottom)
Definition: KDReportsReport.cpp:1093
KDReports::Report::defaultFont
QFont defaultFont() const
Definition: KDReportsReport.cpp:967
QAbstractTextDocumentLayout::draw
virtual void draw(QPainter *painter, const QAbstractTextDocumentLayout::PaintContext &context)=0
KDReports::Report::setWidthForEndlessPrinter
void setWidthForEndlessPrinter(qreal widthMM)
Definition: KDReportsReport.cpp:635
QPainter::setRenderHint
void setRenderHint(QPainter::RenderHint hint, bool on)
QPainter::setFont
void setFont(const QFont &font)
Qt::SmoothTransformation
SmoothTransformation
KDReports::Header
Definition: KDReportsHeader.h:51
KDReports::ErrorDetails::setDriverMessage
void setDriverMessage(const QString &message)
Definition: KDReportsErrorDetails.cpp:77
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QFile
QFont
QPrintDialog
KDReports::ReportPrivate::ensureLayouted
void ensureLayouted()
Definition: KDReportsReport.cpp:111
QImage
KDReports::Report::autoTableElements
QList< KDReports::AutoTableElement * > autoTableElements() const
Definition: KDReportsReport.cpp:1060
KDReports::Report::header
Header & header(HeaderLocations hl=AllPages)
Definition: KDReportsReport.cpp:770
KDReports::Report::fontScalingFactor
qreal fontScalingFactor() const
Definition: KDReportsReport.cpp:1019
KDReports::ReportPrivate::rawMainTextDocHeight
qreal rawMainTextDocHeight() const
Definition: KDReportsReport.cpp:136
KDReports::Report::setPageSize
void setPageSize(QPageSize::PageSizeId size)
Definition: KDReportsReport.cpp:492
QPrinter::Orientation
Orientation
KDReports::Report::TableBreakingPageOrder
TableBreakingPageOrder
Definition: KDReportsReport.h:611
QImage::save
bool save(const QString &fileName, const char *format, int quality) const const
KDReports::ReportPrivate::wantEndlessPrinting
bool wantEndlessPrinting() const
Definition: KDReportsReport.cpp:92
KDReports::Report::maximumNumberOfPagesForHorizontalScaling
int maximumNumberOfPagesForHorizontalScaling() const
Definition: KDReportsReport.cpp:999
Qt::black
black
QPageSize
QPoint
QPrinter
QAbstractItemModel
QIODevice::write
qint64 write(const char *data, qint64 maxSize)
QIODevice::reset
virtual bool reset()
QFile::decodeName
QString decodeName(const QByteArray &localFileName)
KDReports
Definition: KDReportsAbstractReportLayout_p.h:30
KDReports::Report::setFooterBodySpacing
void setFooterBodySpacing(qreal spacing)
Definition: KDReportsReport.cpp:983
QSizeF::width
qreal width() const const
KDReports::Report::reportMode
ReportMode reportMode() const
Definition: KDReportsReport.cpp:1116
QChar::fromLatin1
QChar fromLatin1(char c)
KDReports::pixelsToPointsMultiplier
KDREPORTS_EXPORT qreal pixelsToPointsMultiplier(double resolution)
Definition: KDReportsLayoutHelper.cpp:29
KDReports::Report::setFirstPageNumber
void setFirstPageNumber(int num)
Definition: KDReportsReport.cpp:1160

© 2007-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-reports/
Generated on Fri Jul 15 2022 13:09:07 for KD Reports API Documentation by doxygen 1.8.20