Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qpagelayout.cpp
Go to the documentation of this file.
1// Copyright (C) 2014 John Layt <jlayt@kde.org>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
5#include "qpagelayout.h"
6
7#include <QtCore/qpoint.h>
8#include <QtCore/qrect.h>
9#include <QtCore/qsize.h>
10
11#include <qdebug.h>
12
14
18
19// Multiplier for converting units to points.
20Q_GUI_EXPORT qreal qt_pointMultiplier(QPageLayout::Unit unit)
21{
22 switch (unit) {
24 return 2.83464566929;
26 return 1.0;
28 return 72.0;
30 return 12;
32 return 1.065826771;
34 return 12.789921252;
35 }
36 return 1.0;
37}
38
39// Multiplier for converting pixels to points.
40extern qreal qt_pixelMultiplier(int resolution);
41
42Q_GUI_EXPORT QMarginsF qt_convertMargins(const QMarginsF &margins, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits)
43{
44 // If the margins have the same units, or are all 0, then don't need to convert
45 if (fromUnits == toUnits || margins.isNull())
46 return margins;
47
48 // If converting to points then convert and round up to 2 decimal places
49 if (toUnits == QPageLayout::Point) {
50 const qreal multiplierX100 = qt_pointMultiplier(fromUnits) * 100;
51 return QMarginsF(qCeil(margins.left() * multiplierX100) / 100.0,
52 qCeil(margins.top() * multiplierX100) / 100.0,
53 qCeil(margins.right() * multiplierX100) / 100.0,
54 qCeil(margins.bottom() * multiplierX100) / 100.0);
55 }
56
57 // If converting to other units, need to convert to unrounded points first
58 QMarginsF pointMargins = fromUnits == QPageLayout::Point ? margins : margins * qt_pointMultiplier(fromUnits);
59
60 // Then convert from points to required units rounded to 2 decimal places
61 const qreal multiplier = qt_pointMultiplier(toUnits);
62 return QMarginsF(qRound(pointMargins.left() * 100 / multiplier) / 100.0,
63 qRound(pointMargins.top() * 100 / multiplier) / 100.0,
64 qRound(pointMargins.right() * 100 / multiplier) / 100.0,
65 qRound(pointMargins.bottom() * 100 / multiplier) / 100.0);
66}
67
69{
70public:
71
72 QPageLayoutPrivate(const QPageSize &pageSize, QPageLayout::Orientation orientation,
74 const QMarginsF &minMargins);
76
77 bool operator==(const QPageLayoutPrivate &other) const;
78 bool isEquivalentTo(const QPageLayoutPrivate &other) const;
79
80 bool isValid() const;
81
83
86 QMargins marginsPixels(int resolution) const;
87
88 void setDefaultMargins(const QMarginsF &minMargins);
89
91
92 QRectF fullRect() const;
94 QRect fullRectPoints() const;
95 QRect fullRectPixels(int resolution) const;
96
97 QRectF paintRect() const;
98
99private:
100 friend class QPageLayout;
101
102 QSizeF fullSizeUnits(QPageLayout::Unit units) const;
103
104 QPageSize m_pageSize;
105 QPageLayout::Orientation m_orientation;
106 QPageLayout::Mode m_mode;
107 QPageLayout::Unit m_units;
108 QSizeF m_fullSize;
109 QMarginsF m_margins;
110 QMarginsF m_minMargins;
111 QMarginsF m_maxMargins;
112};
113
116 const QMarginsF &minMargins)
117 : m_pageSize(pageSize),
118 m_orientation(orientation),
119 m_mode(QPageLayout::StandardMode),
120 m_units(units),
121 m_margins(margins)
122{
123 m_fullSize = fullSizeUnits(m_units);
124 setDefaultMargins(minMargins);
125}
126
130
132{
133 return m_pageSize == other.m_pageSize
134 && m_orientation == other.m_orientation
135 && m_units == other.m_units
136 && m_margins == other.m_margins
137 && m_minMargins == other.m_minMargins
138 && m_maxMargins == other.m_maxMargins;
139}
140
142{
143 return m_pageSize.isEquivalentTo(other.m_pageSize)
144 && m_orientation == other.m_orientation
145 && qt_convertMargins(m_margins, m_units, QPageLayout::Point)
146 == qt_convertMargins(other.m_margins, other.m_units, QPageLayout::Point);
147}
148
150{
151 return m_pageSize.isValid();
152}
153
155{
156 return QMarginsF(qBound(m_minMargins.left(), margins.left(), m_maxMargins.left()),
157 qBound(m_minMargins.top(), margins.top(), m_maxMargins.top()),
158 qBound(m_minMargins.right(), margins.right(), m_maxMargins.right()),
159 qBound(m_minMargins.bottom(), margins.bottom(), m_maxMargins.bottom()));
160}
161
163{
164 return qt_convertMargins(m_margins, m_units, units);
165}
166
168{
169 return qt_convertMargins(m_margins, m_units, QPageLayout::Point);
170}
171
173{
174 return QMarginsF(marginsPoints() / qt_pixelMultiplier(resolution)).toMargins();
175}
176
178{
179 m_minMargins = minMargins;
180 m_maxMargins = QMarginsF(qMax(m_fullSize.width() - m_minMargins.right(), qreal(0)),
181 qMax(m_fullSize.height() - m_minMargins.bottom(), qreal(0)),
182 qMax(m_fullSize.width() - m_minMargins.left(), qreal(0)),
183 qMax(m_fullSize.height() - m_minMargins.top(), qreal(0)));
184 if (m_mode == QPageLayout::StandardMode)
185 m_margins = clampMargins(m_margins);
186}
187
188QSizeF QPageLayoutPrivate::fullSizeUnits(QPageLayout::Unit units) const
189{
190 QSizeF fullPageSize = m_pageSize.size(QPageSize::Unit(units));
191 return m_orientation == QPageLayout::Landscape ? fullPageSize.transposed() : fullPageSize;
192}
193
195{
196 return QRectF(QPointF(0, 0), m_fullSize);
197}
198
200{
201 return units == m_units ? fullRect() : QRectF(QPointF(0, 0), fullSizeUnits(units));
202}
203
205{
206 if (m_orientation == QPageLayout::Landscape)
207 return QRect(QPoint(0, 0), m_pageSize.sizePoints().transposed());
208 else
209 return QRect(QPoint(0, 0), m_pageSize.sizePoints());
210}
211
213{
214 if (m_orientation == QPageLayout::Landscape)
215 return QRect(QPoint(0, 0), m_pageSize.sizePixels(resolution).transposed());
216 else
217 return QRect(QPoint(0, 0), m_pageSize.sizePixels(resolution));
218}
219
221{
222 return m_mode == QPageLayout::FullPageMode ? fullRect() : fullRect() - m_margins;
223}
224
225
322
342
351
359
365{
366 d = other.d;
367 return *this;
368}
369
413bool QPageLayout::equals(const QPageLayout &other) const
414{
415 return d == other.d || *d == *other.d;
416}
417
418
425{
426 return d && other.d && d->isEquivalentTo(*other.d);
427}
428
434{
435 return d->isValid();
436}
437
443{
444 d.detach();
445 d->m_mode = mode;
446}
447
453{
454 return d->m_mode;
455}
456
470{
471 if (!pageSize.isValid())
472 return;
473 d.detach();
474 d->m_pageSize = pageSize;
475 d->m_fullSize = d->fullSizeUnits(d->m_units);
476 d->setDefaultMargins(minMargins);
477}
478
488{
489 return d->m_pageSize;
490}
491
500{
501 if (orientation != d->m_orientation) {
502 d.detach();
503 d->m_orientation = orientation;
504 d->m_fullSize = d->fullSizeUnits(d->m_units);
505 // Adust the max margins to reflect change in max page size
506 const qreal change = d->m_fullSize.width() - d->m_fullSize.height();
507 d->m_maxMargins.setLeft(d->m_maxMargins.left() + change);
508 d->m_maxMargins.setRight(d->m_maxMargins.right() + change);
509 d->m_maxMargins.setTop(d->m_maxMargins.top() - change);
510 d->m_maxMargins.setBottom(d->m_maxMargins.bottom() - change);
511 }
512}
513
519{
520 return d->m_orientation;
521}
522
528{
529 if (units != d->m_units) {
530 d.detach();
531 d->m_margins = qt_convertMargins(d->m_margins, d->m_units, units);
532 d->m_minMargins = qt_convertMargins(d->m_minMargins, d->m_units, units);
533 d->m_maxMargins = qt_convertMargins(d->m_maxMargins, d->m_units, units);
534 d->m_units = units;
535 d->m_fullSize = d->fullSizeUnits(d->m_units);
536 }
537}
538
544{
545 return d->m_units;
546}
547
562{
563 if (d->m_mode == FullPageMode) {
564 if (margins != d->m_margins) {
565 d.detach();
566 d->m_margins = margins;
567 }
568 return true;
569 }
570
571 if (outOfBoundsPolicy == OutOfBoundsPolicy::Clamp) {
572 const QMarginsF clampedMargins = d->clampMargins(margins);
573 if (clampedMargins != d->m_margins) {
574 d.detach();
575 d->m_margins = clampedMargins;
576 }
577 return true;
578 }
579
580 if (margins.left() >= d->m_minMargins.left()
581 && margins.right() >= d->m_minMargins.right()
582 && margins.top() >= d->m_minMargins.top()
583 && margins.bottom() >= d->m_minMargins.bottom()
584 && margins.left() <= d->m_maxMargins.left()
585 && margins.right() <= d->m_maxMargins.right()
586 && margins.top() <= d->m_maxMargins.top()
587 && margins.bottom() <= d->m_maxMargins.bottom()) {
588 if (margins != d->m_margins) {
589 d.detach();
590 d->m_margins = margins;
591 }
592 return true;
593 }
594
595 return false;
596}
597
611bool QPageLayout::setLeftMargin(qreal leftMargin, OutOfBoundsPolicy outOfBoundsPolicy)
612{
613 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
614 leftMargin = qBound(d->m_minMargins.left(), leftMargin, d->m_maxMargins.left());
615
616 if (qFuzzyCompare(leftMargin, d->m_margins.left()))
617 return true;
618
619 if (d->m_mode == FullPageMode
620 || (leftMargin >= d->m_minMargins.left() && leftMargin <= d->m_maxMargins.left())) {
621 d.detach();
622 d->m_margins.setLeft(leftMargin);
623 return true;
624 }
625
626 return false;
627}
628
642bool QPageLayout::setRightMargin(qreal rightMargin, OutOfBoundsPolicy outOfBoundsPolicy)
643{
644 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
645 rightMargin = qBound(d->m_minMargins.right(), rightMargin, d->m_maxMargins.right());
646
647 if (qFuzzyCompare(rightMargin, d->m_margins.right()))
648 return true;
649
650 if (d->m_mode == FullPageMode
651 || (rightMargin >= d->m_minMargins.right() && rightMargin <= d->m_maxMargins.right())) {
652 d.detach();
653 d->m_margins.setRight(rightMargin);
654 return true;
655 }
656
657 return false;
658}
659
673bool QPageLayout::setTopMargin(qreal topMargin, OutOfBoundsPolicy outOfBoundsPolicy)
674{
675 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
676 topMargin = qBound(d->m_minMargins.top(), topMargin, d->m_maxMargins.top());
677
678 if (qFuzzyCompare(topMargin, d->m_margins.top()))
679 return true;
680
681 if (d->m_mode == FullPageMode
682 || (topMargin >= d->m_minMargins.top() && topMargin <= d->m_maxMargins.top())) {
683 d.detach();
684 d->m_margins.setTop(topMargin);
685 return true;
686 }
687
688 return false;
689}
690
704bool QPageLayout::setBottomMargin(qreal bottomMargin, OutOfBoundsPolicy outOfBoundsPolicy)
705{
706 if (d->m_mode == StandardMode && outOfBoundsPolicy == OutOfBoundsPolicy::Clamp)
707 bottomMargin = qBound(d->m_minMargins.bottom(), bottomMargin, d->m_maxMargins.bottom());
708
709 if (qFuzzyCompare(bottomMargin, d->m_margins.bottom()))
710 return true;
711
712 if (d->m_mode == FullPageMode
713 || (bottomMargin >= d->m_minMargins.bottom() && bottomMargin <= d->m_maxMargins.bottom())) {
714 d.detach();
715 d->m_margins.setBottom(bottomMargin);
716 return true;
717 }
718
719 return false;
720}
721
729{
730 return d->m_margins;
731}
732
740{
741 return d->margins(units);
742}
743
751{
752 return d->marginsPoints().toMargins();
753}
754
762{
763 return d->marginsPixels(resolution);
764}
765
780{
781 d.detach();
782 d->setDefaultMargins(minMargins);
783}
784
792{
793 return d->m_minMargins;
794}
795
809{
810 return d->m_maxMargins;
811}
812
823{
824 return isValid() ? d->fullRect() : QRect();
825}
826
837{
838 return isValid() ? d->fullRect(units) : QRect();
839}
840
851{
852 return isValid() ? d->fullRectPoints() : QRect();
853}
854
865{
866 return isValid() ? d->fullRectPixels(resolution) : QRect();
867}
868
880{
881 return isValid() ? d->paintRect() : QRectF();
882}
883
895{
896 if (!isValid())
897 return QRectF();
898 if (units == d->m_units)
899 return d->paintRect();
900 return d->m_mode == FullPageMode ? d->fullRect(units)
901 : d->fullRect(units) - d->margins(units);
902}
903
915{
916 if (!isValid())
917 return QRect();
918 return d->m_mode == FullPageMode ? d->fullRectPoints()
919 : d->fullRectPoints() - d->marginsPoints().toMargins();
920}
921
933{
934 if (!isValid())
935 return QRect();
936 return d->m_mode == FullPageMode ? d->fullRectPixels(resolution)
937 : d->fullRectPixels(resolution) - d->marginsPixels(resolution);
938}
939
940#ifndef QT_NO_DEBUG_STREAM
942{
943 QDebugStateSaver saver(dbg);
944 dbg.nospace();
945 dbg.noquote();
946 dbg << "QPageLayout(";
947 if (layout.isValid()) {
948 const QMarginsF margins = layout.margins();
949 dbg << '"' << layout.pageSize().name() << "\", "
950 << (layout.orientation() == QPageLayout::Portrait ? "Portrait" : "Landscape")
951 << ", l:" << margins.left() << " r:" << margins.right() << " t:"
952 << margins.top() << " b:" << margins.bottom() << ' ';
953 switch (layout.units()) {
955 dbg << "mm";
956 break;
958 dbg << "pt";
959 break;
961 dbg << "in";
962 break;
964 dbg << "pc";
965 break;
967 dbg << "DD";
968 break;
970 dbg << "CC";
971 break;
972 }
973 }
974 dbg << ')';
975 return dbg;
976}
977#endif
978
\inmodule QtCore
\inmodule QtCore
void detach()
If the shared data object's reference count is greater than 1, this function creates a deep copy of t...
\inmodule QtCore
Definition qmargins.h:270
constexpr qreal right() const noexcept
Returns the right margin.
Definition qmargins.h:383
constexpr qreal left() const noexcept
Returns the left margin.
Definition qmargins.h:377
constexpr qreal top() const noexcept
Returns the top margin.
Definition qmargins.h:380
constexpr void setLeft(qreal aleft) noexcept
Sets the left margin to aleft (which must be finite).
Definition qmargins.h:390
constexpr bool isNull() const noexcept
Returns true if all margins are very close to 0; otherwise returns false.
Definition qmargins.h:374
constexpr QMargins toMargins() const noexcept
Returns an integer-based copy of this margins object.
Definition qmargins.h:507
constexpr void setRight(qreal aright) noexcept
Sets the right margin to aright (which must be finite).
Definition qmargins.h:396
constexpr void setBottom(qreal abottom) noexcept
Sets the bottom margin to abottom (which must be finite).
Definition qmargins.h:399
constexpr void setTop(qreal atop) noexcept
Sets the top margin to atop (which must be finite).
Definition qmargins.h:393
constexpr qreal bottom() const noexcept
Returns the bottom margin.
Definition qmargins.h:386
\inmodule QtCore
Definition qmargins.h:24
bool isEquivalentTo(const QPageLayoutPrivate &other) const
bool operator==(const QPageLayoutPrivate &other) const
void setDefaultMargins(const QMarginsF &minMargins)
QMargins marginsPixels(int resolution) const
QRect fullRectPixels(int resolution) const
QRect fullRectPoints() const
QMarginsF margins(QPageLayout::Unit units) const
QMarginsF marginsPoints() const
QRectF paintRect() const
bool isValid() const
QPageLayoutPrivate(const QPageSize &pageSize, QPageLayout::Orientation orientation, const QMarginsF &margins, QPageLayout::Unit units, const QMarginsF &minMargins)
QRectF fullRect() const
QSizeF paintSize() const
QMarginsF clampMargins(const QMarginsF &margins) const
\inmodule QtGui
Definition qpagelayout.h:20
QRect paintRectPoints() const
Returns the paintable rectangle in rounded Postscript Points (1/72 of an inch).
QMargins marginsPoints() const
Returns the margins of the page layout in Postscript Points (1/72 of an inch).
QMarginsF minimumMargins() const
Returns the minimum margins of the page layout.
void setOrientation(Orientation orientation)
Sets the page orientation of the page layout to orientation.
QRect fullRectPoints() const
Returns the full page rectangle in Postscript Points (1/72 of an inch).
Mode mode() const
Returns the page layout mode.
QRectF fullRect() const
Returns the full page rectangle in the current layout units.
bool isEquivalentTo(const QPageLayout &other) const
Returns true if this page layout is equivalent to the other page layout, i.e.
void setMinimumMargins(const QMarginsF &minMargins)
Sets the minimum page margins of the page layout to minMargins.
void setUnits(Unit units)
Sets the units used to define the page layout.
bool setTopMargin(qreal topMargin, OutOfBoundsPolicy outOfBoundsPolicy=OutOfBoundsPolicy::Reject)
Sets the top page margin of the page layout to topMargin.
Unit units() const
Returns the units the page layout is currently defined in.
bool setRightMargin(qreal rightMargin, OutOfBoundsPolicy outOfBoundsPolicy=OutOfBoundsPolicy::Reject)
Sets the right page margin of the page layout to rightMargin.
bool isValid() const
Returns true if this page layout is valid.
QMargins marginsPixels(int resolution) const
Returns the margins of the page layout in device pixels for the given resolution.
QRectF paintRect() const
Returns the page rectangle in the current layout units.
Unit
This enum type is used to specify the measurement unit for page layout and margins.
Definition qpagelayout.h:24
QPageLayout()
Creates an invalid QPageLayout.
QMarginsF margins() const
Returns the margins of the page layout using the currently set units.
Mode
Defines the page layout mode.
Definition qpagelayout.h:38
QPageLayout & operator=(const QPageLayout &other)
Assignment operator, assigns other to this.
bool setBottomMargin(qreal bottomMargin, OutOfBoundsPolicy outOfBoundsPolicy=OutOfBoundsPolicy::Reject)
Sets the bottom page margin of the page layout to bottomMargin.
Orientation orientation() const
Returns the page orientation of the page layout.
~QPageLayout()
Destroys the page layout.
QMarginsF maximumMargins() const
Returns the maximum margins that would be applied if the page layout was in StandardMode.
bool setLeftMargin(qreal leftMargin, OutOfBoundsPolicy outOfBoundsPolicy=OutOfBoundsPolicy::Reject)
Sets the left page margin of the page layout to leftMargin.
bool setMargins(const QMarginsF &margins, OutOfBoundsPolicy outOfBoundsPolicy=OutOfBoundsPolicy::Reject)
Sets the page margins of the page layout to margins.
QRect paintRectPixels(int resolution) const
Returns the paintable rectangle in rounded device pixels for the given resolution.
void setPageSize(const QPageSize &pageSize, const QMarginsF &minMargins=QMarginsF(0, 0, 0, 0))
Sets the page size of the page layout to pageSize.
Orientation
This enum type defines the page orientation.
Definition qpagelayout.h:33
QRect fullRectPixels(int resolution) const
Returns the full page rectangle in device pixels for the given resolution.
void setMode(Mode mode)
Sets a page layout mode to mode.
QPageSize pageSize() const
Returns the page size of the page layout.
\inmodule QtGui
Definition qpagesize.h:22
bool isValid() const
Returns true if this page size is valid.
Unit
This enum type is used to specify the measurement unit for page sizes.
Definition qpagesize.h:175
QSizeF size(Unit units) const
Returns the size of the page in the required units.
QSize sizePoints() const
Returns the size of the page in Postscript Points (1/72 of an inch).
QSize sizePixels(int resolution) const
Returns the size of the page in Device Pixels at the given resolution.
bool isEquivalentTo(const QPageSize &other) const
Returns true if this page is equivalent to the other page, i.e.
\inmodule QtCore\reentrant
Definition qpoint.h:217
\inmodule QtCore\reentrant
Definition qpoint.h:25
\inmodule QtCore\reentrant
Definition qrect.h:484
\inmodule QtCore\reentrant
Definition qrect.h:30
\inmodule QtCore
Definition qshareddata.h:19
\inmodule QtCore
Definition qsize.h:208
constexpr qreal width() const noexcept
Returns the width.
Definition qsize.h:332
constexpr qreal height() const noexcept
Returns the height.
Definition qsize.h:335
constexpr QSize transposed() const noexcept
Definition qsize.h:142
Combined button and popup list for selecting options.
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
int qRound(qfloat16 d) noexcept
Definition qfloat16.h:327
int qCeil(T v)
Definition qmath.h:36
#define QT_IMPL_METATYPE_EXTERN_TAGGED(TYPE, TAG)
Definition qmetatype.h:1384
#define QT_IMPL_METATYPE_EXTERN(TYPE)
Definition qmetatype.h:1390
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLenum mode
GLfloat units
Q_GUI_EXPORT QMarginsF qt_convertMargins(const QMarginsF &margins, QPageLayout::Unit fromUnits, QPageLayout::Unit toUnits)
qreal qt_pixelMultiplier(int resolution)
QDebug operator<<(QDebug dbg, const QPageLayout &layout)
QT_BEGIN_NAMESPACE Q_GUI_EXPORT qreal qt_pointMultiplier(QPageLayout::Unit unit)
double qreal
Definition qtypes.h:187
QVBoxLayout * layout
QSharedPointer< T > other(t)
[5]