source: trunk/src/corelib/tools/qrect.cpp@ 659

Last change on this file since 659 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

File size: 58.9 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtCore module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qrect.h"
43#include "qdatastream.h"
44#include "qdebug.h"
45#include "qmath.h"
46
47#include <math.h>
48
49QT_BEGIN_NAMESPACE
50
51/*!
52 \class QRect
53 \ingroup painting
54
55 \brief The QRect class defines a rectangle in the plane using
56 integer precision.
57
58 A rectangle is normally expressed as an upper-left corner and a
59 size. The size (width and height) of a QRect is always equivalent
60 to the mathematical rectangle that forms the basis for its
61 rendering.
62
63 A QRect can be constructed with a set of left, top, width and
64 height integers, or from a QPoint and a QSize. The following code
65 creates two identical rectangles.
66
67 \snippet doc/src/snippets/code/src_corelib_tools_qrect.cpp 0
68
69 There is a third constructor that creates a QRect using the
70 top-left and bottom-right coordinates, but we recommend that you
71 avoid using it. The rationale is that for historical reasons the
72 values returned by the bottom() and right() functions deviate from
73 the true bottom-right corner of the rectangle.
74
75 The QRect class provides a collection of functions that return the
76 various rectangle coordinates, and enable manipulation of
77 these. QRect also provide functions to move the rectangle relative
78 to the various coordinates. In addition there is a moveTo()
79 function that moves the rectangle, leaving its top left corner at
80 the given coordinates. Alternatively, the translate() function
81 moves the rectangle the given offset relative to the current
82 position, and the translated() function returns a translated copy
83 of this rectangle.
84
85 The size() function returns the rectange's dimensions as a
86 QSize. The dimensions can also be retrieved separately using the
87 width() and height() functions. To manipulate the dimensions use
88 the setSize(), setWidth() or setHeight() functions. Alternatively,
89 the size can be changed by applying either of the functions
90 setting the rectangle coordinates, for example, setBottom() or
91 setRight().
92
93 The contains() function tells whether a given point is inside the
94 rectangle or not, and the intersects() function returns true if
95 this rectangle intersects with a given rectangle. The QRect class
96 also provides the intersected() function which returns the
97 intersection rectangle, and the united() function which returns the
98 rectangle that encloses the given rectangle and this:
99
100 \table
101 \row
102 \o \inlineimage qrect-intersect.png
103 \o \inlineimage qrect-unite.png
104 \row
105 \o intersected()
106 \o united()
107 \endtable
108
109 The isEmpty() function returns true if left() > right() or top() >
110 bottom(). Note that an empty rectangle is not valid: The isValid()
111 function returns true if left() <= right() \e and top() <=
112 bottom(). A null rectangle (isNull() == true) on the other hand,
113 has both width and height set to 0.
114
115 Note that due to the way QRect and QRectF are defined, an
116 empty QRect is defined in essentially the same way as QRectF.
117
118 Finally, QRect objects can be streamed as well as compared.
119
120 \tableofcontents
121
122 \section1 Rendering
123
124 When using an \l {QPainter::Antialiasing}{anti-aliased} painter,
125 the boundary line of a QRect will be rendered symmetrically on
126 both sides of the mathematical rectangle's boundary line. But when
127 using an aliased painter (the default) other rules apply.
128
129 Then, when rendering with a one pixel wide pen the QRect's boundary
130 line will be rendered to the right and below the mathematical
131 rectangle's boundary line.
132
133 When rendering with a two pixels wide pen the boundary line will
134 be split in the middle by the mathematical rectangle. This will be
135 the case whenever the pen is set to an even number of pixels,
136 while rendering with a pen with an odd number of pixels, the spare
137 pixel will be rendered to the right and below the mathematical
138 rectangle as in the one pixel case.
139
140 \table
141 \row
142 \o \inlineimage qrect-diagram-zero.png
143 \o \inlineimage qrect-diagram-one.png
144 \row
145 \o Logical representation
146 \o One pixel wide pen
147 \row
148 \o \inlineimage qrect-diagram-two.png
149 \o \inlineimage qrect-diagram-three.png
150 \row
151 \o Two pixel wide pen
152 \o Three pixel wide pen
153 \endtable
154
155 \section1 Coordinates
156
157 The QRect class provides a collection of functions that return the
158 various rectangle coordinates, and enable manipulation of
159 these. QRect also provide functions to move the rectangle relative
160 to the various coordinates.
161
162 For example the left(), setLeft() and moveLeft() functions as an
163 example: left() returns the x-coordinate of the rectangle's left
164 edge, setLeft() sets the left edge of the rectangle to the given x
165 coordinate (it may change the width, but will never change the
166 rectangle's right edge) and moveLeft() moves the entire rectangle
167 horizontally, leaving the rectangle's left edge at the given x
168 coordinate and its size unchanged.
169
170 \image qrect-coordinates.png
171
172 Note that for historical reasons the values returned by the
173 bottom() and right() functions deviate from the true bottom-right
174 corner of the rectangle: The right() function returns \e { left()
175 + width() - 1} and the bottom() function returns \e {top() +
176 height() - 1}. The same is the case for the point returned by the
177 bottomRight() convenience function. In addition, the x and y
178 coordinate of the topRight() and bottomLeft() functions,
179 respectively, contain the same deviation from the true right and
180 bottom edges.
181
182 We recommend that you use x() + width() and y() + height() to find
183 the true bottom-right corner, and avoid right() and
184 bottom(). Another solution is to use QRectF: The QRectF class
185 defines a rectangle in the plane using floating point accuracy for
186 coordinates, and the QRectF::right() and QRectF::bottom()
187 functions \e do return the right and bottom coordinates.
188
189 It is also possible to add offsets to this rectangle's coordinates
190 using the adjust() function, as well as retrieve a new rectangle
191 based on adjustments of the original one using the adjusted()
192 function. If either of the width and height is negative, use the
193 normalized() function to retrieve a rectangle where the corners
194 are swapped.
195
196 In addition, QRect provides the getCoords() function which extracts
197 the position of the rectangle's top-left and bottom-right corner,
198 and the getRect() function which extracts the rectangle's top-left
199 corner, width and height. Use the setCoords() and setRect()
200 function to manipulate the rectangle's coordinates and dimensions
201 in one go.
202
203 \sa QRectF, QRegion
204*/
205
206/*****************************************************************************
207 QRect member functions
208 *****************************************************************************/
209
210/*!
211 \fn QRect::QRect()
212
213 Constructs a null rectangle.
214
215 \sa isNull()
216*/
217
218/*!
219 \fn QRect::QRect(const QPoint &topLeft, const QPoint &bottomRight)
220
221 Constructs a rectangle with the given \a topLeft and \a bottomRight corners.
222
223 \sa setTopLeft(), setBottomRight()
224*/
225
226
227/*!
228 \fn QRect::QRect(const QPoint &topLeft, const QSize &size)
229
230 Constructs a rectangle with the given \a topLeft corner and the
231 given \a size.
232
233 \sa setTopLeft(), setSize()
234*/
235
236
237/*!
238 \fn QRect::QRect(int x, int y, int width, int height)
239
240 Constructs a rectangle with (\a x, \a y) as its top-left corner
241 and the given \a width and \a height.
242
243 \sa setRect()
244*/
245
246
247/*!
248 \fn bool QRect::isNull() const
249
250 Returns true if the rectangle is a null rectangle, otherwise
251 returns false.
252
253 A null rectangle has both the width and the height set to 0 (i.e.,
254 right() == left() - 1 and bottom() == top() - 1). A null rectangle
255 is also empty, and hence is not valid.
256
257 \sa isEmpty(), isValid()
258*/
259
260/*!
261 \fn bool QRect::isEmpty() const
262
263 Returns true if the rectangle is empty, otherwise returns false.
264
265 An empty rectangle has a left() > right() or top() > bottom(). An
266 empty rectangle is not valid (i.e., isEmpty() == !isValid()).
267
268 Use the normalized() function to retrieve a rectangle where the
269 corners are swapped.
270
271 \sa isNull(), isValid(), normalized()
272*/
273
274/*!
275 \fn bool QRect::isValid() const
276
277 Returns true if the rectangle is valid, otherwise returns false.
278
279 A valid rectangle has a left() < right() and top() <
280 bottom(). Note that non-trivial operations like intersections are
281 not defined for invalid rectangles. A valid rectangle is not empty
282 (i.e., isValid() == !isEmpty()).
283
284 \sa isNull(), isEmpty(), normalized()
285*/
286
287
288/*!
289 Returns a normalized rectangle; i.e., a rectangle that has a
290 non-negative width and height.
291
292 If width() < 0 the function swaps the left and right corners, and
293 it swaps the top and bottom corners if height() < 0.
294
295 \sa isValid(), isEmpty()
296*/
297
298QRect QRect::normalized() const
299{
300 QRect r;
301 if (x2 < x1 - 1) { // swap bad x values
302 r.x1 = x2;
303 r.x2 = x1;
304 } else {
305 r.x1 = x1;
306 r.x2 = x2;
307 }
308 if (y2 < y1 - 1) { // swap bad y values
309 r.y1 = y2;
310 r.y2 = y1;
311 } else {
312 r.y1 = y1;
313 r.y2 = y2;
314 }
315 return r;
316}
317
318
319/*!
320 \fn QRect QRect::normalize() const
321 \compat
322
323 Returns a normalized rectangle; i.e., a rectangle that has a
324 non-negative width and height.
325
326 Use the normalized() function instead
327*/
328
329/*!
330 \fn int QRect::left() const
331
332 Returns the x-coordinate of the rectangle's left edge. Equivalent
333 to x().
334
335 \sa setLeft(), topLeft(), bottomLeft()
336*/
337
338/*!
339 \fn int QRect::top() const
340
341 Returns the y-coordinate of the rectangle's top edge.
342 Equivalent to y().
343
344 \sa setTop(), topLeft(), topRight()
345*/
346
347/*!
348 \fn int QRect::right() const
349
350 Returns the x-coordinate of the rectangle's right edge.
351
352 Note that for historical reasons this function returns left() +
353 width() - 1; use x() + width() to retrieve the true x-coordinate.
354
355 \sa setRight(), topRight(), bottomRight()
356*/
357
358/*!
359 \fn int QRect::bottom() const
360
361 Returns the y-coordinate of the rectangle's bottom edge.
362
363 Note that for historical reasons this function returns top() +
364 height() - 1; use y() + height() to retrieve the true y-coordinate.
365
366 \sa setBottom(), bottomLeft(), bottomRight()
367*/
368
369/*!
370 \fn int &QRect::rLeft()
371 \compat
372
373 Returns a reference to the left coordinate of the rectangle.
374
375 Use the left() function instead.
376*/
377
378/*!
379 \fn int &QRect::rTop()
380 \compat
381
382 Returns a reference to the top coordinate of the rectangle.
383
384 Use the top() function instead.
385*/
386
387/*!
388 \fn int &QRect::rRight()
389 \compat
390
391 Returns a reference to the right coordinate of the rectangle.
392
393 Use the right() function instead.
394*/
395
396/*!
397 \fn int &QRect::rBottom()
398 \compat
399
400 Returns a reference to the bottom coordinate of the rectangle.
401
402 Use the bottom() function instead.
403*/
404
405/*!
406 \fn int QRect::x() const
407
408 Returns the x-coordinate of the rectangle's left edge. Equivalent to left().
409
410 \sa setX(), y(), topLeft()
411*/
412
413/*!
414 \fn int QRect::y() const
415
416 Returns the y-coordinate of the rectangle's top edge. Equivalent to top().
417
418 \sa setY(), x(), topLeft()
419*/
420
421/*!
422 \fn void QRect::setLeft(int x)
423
424 Sets the left edge of the rectangle to the given \a x
425 coordinate. May change the width, but will never change the right
426 edge of the rectangle.
427
428 Equivalent to setX().
429
430 \sa left(), moveLeft()
431*/
432
433/*!
434 \fn void QRect::setTop(int y)
435
436 Sets the top edge of the rectangle to the given \a y
437 coordinate. May change the height, but will never change the
438 bottom edge of the rectangle.
439
440 Equivalent to setY().
441
442 \sa top(), moveTop()
443*/
444
445/*!
446 \fn void QRect::setRight(int x)
447
448 Sets the right edge of the rectangle to the given \a x
449 coordinate. May change the width, but will never change the left
450 edge of the rectangle.
451
452 \sa right(), moveRight()
453*/
454
455/*!
456 \fn void QRect::setBottom(int y)
457
458 Sets the bottom edge of the rectangle to the given \a y
459 coordinate. May change the height, but will never change the top
460 edge of the rectangle.
461
462 \sa bottom(), moveBottom(),
463*/
464
465/*!
466 \fn void QRect::setX(int x)
467
468 Sets the left edge of the rectangle to the given \a x
469 coordinate. May change the width, but will never change the right
470 edge of the rectangle.
471
472 Equivalent to setLeft().
473
474 \sa x(), setY(), setTopLeft()
475*/
476
477/*!
478 \fn void QRect::setY(int y)
479
480 Sets the top edge of the rectangle to the given \a y
481 coordinate. May change the height, but will never change the
482 bottom edge of the rectangle.
483
484 Equivalent to setTop().
485
486 \sa y(), setX(), setTopLeft()
487*/
488
489/*!
490 \fn void QRect::setTopLeft(const QPoint &position)
491
492 Set the top-left corner of the rectangle to the given \a
493 position. May change the size, but will never change the
494 bottom-right corner of the rectangle.
495
496 \sa topLeft(), moveTopLeft()
497*/
498
499/*!
500 \fn void QRect::setBottomRight(const QPoint &position)
501
502 Set the bottom-right corner of the rectangle to the given \a
503 position. May change the size, but will never change the
504 top-left corner of the rectangle.
505
506 \sa bottomRight(), moveBottomRight()
507*/
508
509/*!
510 \fn void QRect::setTopRight(const QPoint &position)
511
512 Set the top-right corner of the rectangle to the given \a
513 position. May change the size, but will never change the
514 bottom-left corner of the rectangle.
515
516 \sa topRight(), moveTopRight()
517*/
518
519/*!
520 \fn void QRect::setBottomLeft(const QPoint &position)
521
522 Set the bottom-left corner of the rectangle to the given \a
523 position. May change the size, but will never change the
524 top-right corner of the rectangle.
525
526 \sa bottomLeft(), moveBottomLeft()
527*/
528
529/*!
530 \fn QPoint QRect::topLeft() const
531
532 Returns the position of the rectangle's top-left corner.
533
534 \sa setTopLeft(), top(), left()
535*/
536
537/*!
538 \fn QPoint QRect::bottomRight() const
539
540 Returns the position of the rectangle's bottom-right corner.
541
542 Note that for historical reasons this function returns
543 QPoint(left() + width() -1, top() + height() - 1).
544
545 \sa setBottomRight(), bottom(), right()
546*/
547
548/*!
549 \fn QPoint QRect::topRight() const
550
551 Returns the position of the rectangle's top-right corner.
552
553 Note that for historical reasons this function returns
554 QPoint(left() + width() -1, top()).
555
556 \sa setTopRight(), top(), right()
557*/
558
559/*!
560 \fn QPoint QRect::bottomLeft() const
561
562 Returns the position of the rectangle's bottom-left corner. Note
563 that for historical reasons this function returns QPoint(left(),
564 top() + height() - 1).
565
566 \sa setBottomLeft(), bottom(), left()
567*/
568
569/*!
570 \fn QPoint QRect::center() const
571
572 Returns the center point of the rectangle.
573
574 \sa moveCenter()
575*/
576
577
578/*!
579 \fn void QRect::getRect(int *x, int *y, int *width, int *height) const
580
581 Extracts the position of the rectangle's top-left corner to *\a x
582 and *\a y, and its dimensions to *\a width and *\a height.
583
584 \sa setRect(), getCoords()
585*/
586
587
588/*!
589 \fn void QRect::getCoords(int *x1, int *y1, int *x2, int *y2) const
590
591 Extracts the position of the rectangle's top-left corner to *\a x1
592 and *\a y1, and the position of the bottom-right corner to *\a x2
593 and *\a y2.
594
595 \sa setCoords(), getRect()
596*/
597
598/*!
599 \fn void QRect::rect(int *x, int *y, int *width, int *height) const
600 \compat
601
602 Extracts the position of the rectangle's top-left corner to *\a x and
603 *\a y, and its dimensions to *\a width and * \a height.
604
605 Use the getRect() function instead.
606*/
607
608
609/*!
610 \fn void QRect::coords(int *x1, int *y1, int *x2, int *y2) const
611 \compat
612
613 Extracts the position of the rectangle's top-left corner to *\a x1
614 and *\a y1, and the position of the bottom-right corner to *\a x2
615 and *\a y2.
616
617 Use the getCoords() function instead.
618*/
619
620/*!
621 \fn void QRect::moveLeft(int x)
622
623 Moves the rectangle horizontally, leaving the rectangle's left
624 edge at the given \a x coordinate. The rectangle's size is
625 unchanged.
626
627 \sa left(), setLeft(), moveRight()
628*/
629
630/*!
631 \fn void QRect::moveTop(int y)
632
633 Moves the rectangle vertically, leaving the rectangle's top edge
634 at the given \a y coordinate. The rectangle's size is unchanged.
635
636 \sa top(), setTop(), moveBottom()
637*/
638
639
640/*!
641 \fn void QRect::moveRight(int x)
642
643 Moves the rectangle horizontally, leaving the rectangle's right
644 edge at the given \a x coordinate. The rectangle's size is
645 unchanged.
646
647 \sa right(), setRight(), moveLeft()
648*/
649
650
651/*!
652 \fn void QRect::moveBottom(int y)
653
654 Moves the rectangle vertically, leaving the rectangle's bottom
655 edge at the given \a y coordinate. The rectangle's size is
656 unchanged.
657
658 \sa bottom(), setBottom(), moveTop()
659*/
660
661
662/*!
663 \fn void QRect::moveTopLeft(const QPoint &position)
664
665 Moves the rectangle, leaving the top-left corner at the given \a
666 position. The rectangle's size is unchanged.
667
668 \sa setTopLeft(), moveTop(), moveLeft()
669*/
670
671
672/*!
673 \fn void QRect::moveBottomRight(const QPoint &position)
674
675 Moves the rectangle, leaving the bottom-right corner at the given
676 \a position. The rectangle's size is unchanged.
677
678 \sa setBottomRight(), moveRight(), moveBottom()
679*/
680
681
682/*!
683 \fn void QRect::moveTopRight(const QPoint &position)
684
685 Moves the rectangle, leaving the top-right corner at the given \a
686 position. The rectangle's size is unchanged.
687
688 \sa setTopRight(), moveTop(), moveRight()
689*/
690
691
692/*!
693 \fn void QRect::moveBottomLeft(const QPoint &position)
694
695 Moves the rectangle, leaving the bottom-left corner at the given
696 \a position. The rectangle's size is unchanged.
697
698 \sa setBottomLeft(), moveBottom(), moveLeft()
699*/
700
701
702/*!
703 \fn void QRect::moveCenter(const QPoint &position)
704
705 Moves the rectangle, leaving the center point at the given \a
706 position. The rectangle's size is unchanged.
707
708 \sa center()
709*/
710
711void QRect::moveCenter(const QPoint &p)
712{
713 int w = x2 - x1;
714 int h = y2 - y1;
715 x1 = p.x() - w/2;
716 y1 = p.y() - h/2;
717 x2 = x1 + w;
718 y2 = y1 + h;
719}
720
721/*!
722 \fn void QRect::moveBy(int dx, int dy)
723 \compat
724
725 Moves the rectangle \a dx along the x axis and \a dy along the y
726 axis, relative to the current position.
727
728 Use the translate() function instead.
729*/
730
731/*!
732 \fn void QRect::moveBy(const QPoint &)
733 \compat
734
735 Use the translate() function instead.
736*/
737
738/*!
739 \fn void QRect::moveTo(int x, int y)
740
741 Moves the rectangle, leaving the top-left corner at the given
742 position (\a x, \a y). The rectangle's size is unchanged.
743
744 \sa translate(), moveTopLeft()
745*/
746
747/*!
748 \fn void QRect::moveTo(const QPoint &position)
749
750 Moves the rectangle, leaving the top-left corner at the given \a
751 position.
752*/
753
754/*!
755 \fn void QRect::translate(int dx, int dy)
756
757 Moves the rectangle \a dx along the x axis and \a dy along the y
758 axis, relative to the current position. Positive values move the
759 rectangle to the right and down.
760
761 \sa moveTopLeft(), moveTo(), translated()
762*/
763
764
765/*!
766 \fn void QRect::translate(const QPoint &offset)
767 \overload
768
769 Moves the rectangle \a{offset}.\l{QPoint::x()}{x()} along the x
770 axis and \a{offset}.\l{QPoint::y()}{y()} along the y axis,
771 relative to the current position.
772*/
773
774
775/*!
776 \fn QRect QRect::translated(int dx, int dy) const
777
778 Returns a copy of the rectangle that is translated \a dx along the
779 x axis and \a dy along the y axis, relative to the current
780 position. Positive values move the rectangle to the right and
781 down.
782
783 \sa translate()
784
785*/
786
787
788/*!
789 \fn QRect QRect::translated(const QPoint &offset) const
790
791 \overload
792
793 Returns a copy of the rectangle that is translated
794 \a{offset}.\l{QPoint::x()}{x()} along the x axis and
795 \a{offset}.\l{QPoint::y()}{y()} along the y axis, relative to the
796 current position.
797*/
798
799
800/*!
801 \fn void QRect::setRect(int x, int y, int width, int height)
802
803 Sets the coordinates of the rectangle's top-left corner to (\a{x},
804 \a{y}), and its size to the given \a width and \a height.
805
806 \sa getRect(), setCoords()
807*/
808
809
810/*!
811 \fn void QRect::setCoords(int x1, int y1, int x2, int y2)
812
813 Sets the coordinates of the rectangle's top-left corner to (\a x1,
814 \a y1), and the coordinates of its bottom-right corner to (\a x2,
815 \a y2).
816
817 \sa getCoords(), setRect()
818*/
819
820
821/*!
822 \fn void QRect::addCoords(int dx1, int dy1, int dx2, int dy2)
823 \compat
824
825 Adds \a dx1, \a dy1, \a dx2 and \a dy2 to the existing coordinates
826 of the rectangle respectively.
827
828 Use the adjust() function instead.
829*/
830
831/*! \fn QRect QRect::adjusted(int dx1, int dy1, int dx2, int dy2) const
832
833 Returns a new rectangle with \a dx1, \a dy1, \a dx2 and \a dy2
834 added respectively to the existing coordinates of this rectangle.
835
836 \sa adjust()
837*/
838
839/*! \fn void QRect::adjust(int dx1, int dy1, int dx2, int dy2)
840
841 Adds \a dx1, \a dy1, \a dx2 and \a dy2 respectively to the
842 existing coordinates of the rectangle.
843
844 \sa adjusted(), setRect()
845*/
846
847/*!
848 \fn QSize QRect::size() const
849
850 Returns the size of the rectangle.
851
852 \sa setSize(), width(), height()
853*/
854
855/*!
856 \fn int QRect::width() const
857
858 Returns the width of the rectangle.
859
860 \sa setWidth(), height(), size()
861*/
862
863/*!
864 \fn int QRect::height() const
865
866 Returns the height of the rectangle.
867
868 \sa setHeight(), width(), size()
869*/
870
871/*!
872 \fn void QRect::setWidth(int width)
873
874 Sets the width of the rectangle to the given \a width. The right
875 edge is changed, but not the left one.
876
877 \sa width(), setSize()
878*/
879
880
881/*!
882 \fn void QRect::setHeight(int height)
883
884 Sets the height of the rectangle to the given \a height. The bottom
885 edge is changed, but not the top one.
886
887 \sa height(), setSize()
888*/
889
890
891/*!
892 \fn void QRect::setSize(const QSize &size)
893
894 Sets the size of the rectangle to the given \a size. The top-left
895 corner is not moved.
896
897 \sa size(), setWidth(), setHeight()
898*/
899
900
901/*!
902 \fn bool QRect::contains(const QPoint &point, bool proper) const
903
904 Returns true if the given \a point is inside or on the edge of
905 the rectangle, otherwise returns false. If \a proper is true, this
906 function only returns true if the given \a point is \e inside the
907 rectangle (i.e., not on the edge).
908
909 \sa intersects()
910*/
911
912bool QRect::contains(const QPoint &p, bool proper) const
913{
914 int l, r;
915 if (x2 < x1 - 1) {
916 l = x2;
917 r = x1;
918 } else {
919 l = x1;
920 r = x2;
921 }
922 if (proper) {
923 if (p.x() <= l || p.x() >= r)
924 return false;
925 } else {
926 if (p.x() < l || p.x() > r)
927 return false;
928 }
929 int t, b;
930 if (y2 < y1 - 1) {
931 t = y2;
932 b = y1;
933 } else {
934 t = y1;
935 b = y2;
936 }
937 if (proper) {
938 if (p.y() <= t || p.y() >= b)
939 return false;
940 } else {
941 if (p.y() < t || p.y() > b)
942 return false;
943 }
944 return true;
945}
946
947
948/*!
949 \fn bool QRect::contains(int x, int y, bool proper) const
950 \overload
951
952 Returns true if the point (\a x, \a y) is inside or on the edge of
953 the rectangle, otherwise returns false. If \a proper is true, this
954 function only returns true if the point is entirely inside the
955 rectangle(not on the edge).
956*/
957
958/*!
959 \fn bool QRect::contains(int x, int y) const
960 \overload
961
962 Returns true if the point (\a x, \a y) is inside this rectangle,
963 otherwise returns false.
964*/
965
966/*!
967 \fn bool QRect::contains(const QRect &rectangle, bool proper) const
968 \overload
969
970 Returns true if the given \a rectangle is inside this rectangle.
971 otherwise returns false. If \a proper is true, this function only
972 returns true if the \a rectangle is entirely inside this
973 rectangle (not on the edge).
974*/
975
976bool QRect::contains(const QRect &r, bool proper) const
977{
978 if (isNull() || r.isNull())
979 return false;
980
981 int l1 = x1;
982 int r1 = x1;
983 if (x2 - x1 + 1 < 0)
984 l1 = x2;
985 else
986 r1 = x2;
987
988 int l2 = r.x1;
989 int r2 = r.x1;
990 if (r.x2 - r.x1 + 1 < 0)
991 l2 = r.x2;
992 else
993 r2 = r.x2;
994
995 if (proper) {
996 if (l2 <= l1 || r2 >= r1)
997 return false;
998 } else {
999 if (l2 < l1 || r2 > r1)
1000 return false;
1001 }
1002
1003 int t1 = y1;
1004 int b1 = y1;
1005 if (y2 - y1 + 1 < 0)
1006 t1 = y2;
1007 else
1008 b1 = y2;
1009
1010 int t2 = r.y1;
1011 int b2 = r.y1;
1012 if (r.y2 - r.y1 + 1 < 0)
1013 t2 = r.y2;
1014 else
1015 b2 = r.y2;
1016
1017 if (proper) {
1018 if (t2 <= t1 || b2 >= b1)
1019 return false;
1020 } else {
1021 if (t2 < t1 || b2 > b1)
1022 return false;
1023 }
1024
1025 return true;
1026}
1027
1028/*!
1029 \fn QRect& QRect::operator|=(const QRect &rectangle)
1030
1031 Unites this rectangle with the given \a rectangle.
1032
1033 \sa united(), operator|()
1034*/
1035
1036/*!
1037 \fn QRect& QRect::operator&=(const QRect &rectangle)
1038
1039 Intersects this rectangle with the given \a rectangle.
1040
1041 \sa intersected(), operator&()
1042*/
1043
1044
1045/*!
1046 \fn QRect QRect::operator|(const QRect &rectangle) const
1047
1048 Returns the bounding rectangle of this rectangle and the given \a
1049 rectangle.
1050
1051 \sa operator|=(), united()
1052*/
1053
1054QRect QRect::operator|(const QRect &r) const
1055{
1056 if (isNull())
1057 return r;
1058 if (r.isNull())
1059 return *this;
1060
1061 int l1 = x1;
1062 int r1 = x1;
1063 if (x2 - x1 + 1 < 0)
1064 l1 = x2;
1065 else
1066 r1 = x2;
1067
1068 int l2 = r.x1;
1069 int r2 = r.x1;
1070 if (r.x2 - r.x1 + 1 < 0)
1071 l2 = r.x2;
1072 else
1073 r2 = r.x2;
1074
1075 int t1 = y1;
1076 int b1 = y1;
1077 if (y2 - y1 + 1 < 0)
1078 t1 = y2;
1079 else
1080 b1 = y2;
1081
1082 int t2 = r.y1;
1083 int b2 = r.y1;
1084 if (r.y2 - r.y1 + 1 < 0)
1085 t2 = r.y2;
1086 else
1087 b2 = r.y2;
1088
1089 QRect tmp;
1090 tmp.x1 = qMin(l1, l2);
1091 tmp.x2 = qMax(r1, r2);
1092 tmp.y1 = qMin(t1, t2);
1093 tmp.y2 = qMax(b1, b2);
1094 return tmp;
1095}
1096
1097/*!
1098 \fn QRect QRect::unite(const QRect &rectangle) const
1099 \obsolete
1100
1101 Use united(\a rectangle) instead.
1102*/
1103
1104/*!
1105 \fn QRect QRect::united(const QRect &rectangle) const
1106 \since 4.2
1107
1108 Returns the bounding rectangle of this rectangle and the given \a rectangle.
1109
1110 \image qrect-unite.png
1111
1112 \sa intersected()
1113*/
1114
1115
1116/*!
1117 \fn QRect QRect::operator&(const QRect &rectangle) const
1118
1119 Returns the intersection of this rectangle and the given \a
1120 rectangle. Returns an empty rectangle if there is no intersection.
1121
1122 \sa operator&=(), intersected()
1123*/
1124
1125QRect QRect::operator&(const QRect &r) const
1126{
1127 if (isNull() || r.isNull())
1128 return QRect();
1129
1130 int l1 = x1;
1131 int r1 = x1;
1132 if (x2 - x1 + 1 < 0)
1133 l1 = x2;
1134 else
1135 r1 = x2;
1136
1137 int l2 = r.x1;
1138 int r2 = r.x1;
1139 if (r.x2 - r.x1 + 1 < 0)
1140 l2 = r.x2;
1141 else
1142 r2 = r.x2;
1143
1144 if (l1 > r2 || l2 > r1)
1145 return QRect();
1146
1147 int t1 = y1;
1148 int b1 = y1;
1149 if (y2 - y1 + 1 < 0)
1150 t1 = y2;
1151 else
1152 b1 = y2;
1153
1154 int t2 = r.y1;
1155 int b2 = r.y1;
1156 if (r.y2 - r.y1 + 1 < 0)
1157 t2 = r.y2;
1158 else
1159 b2 = r.y2;
1160
1161 if (t1 > b2 || t2 > b1)
1162 return QRect();
1163
1164 QRect tmp;
1165 tmp.x1 = qMax(l1, l2);
1166 tmp.x2 = qMin(r1, r2);
1167 tmp.y1 = qMax(t1, t2);
1168 tmp.y2 = qMin(b1, b2);
1169 return tmp;
1170}
1171
1172/*!
1173 \fn QRect QRect::intersect(const QRect &rectangle) const
1174 \obsolete
1175
1176 Use intersected(\a rectangle) instead.
1177*/
1178
1179/*!
1180 \fn QRect QRect::intersected(const QRect &rectangle) const
1181 \since 4.2
1182
1183 Returns the intersection of this rectangle and the given \a
1184 rectangle. Note that \c{r.intersected(s)} is equivalent to \c{r & s}.
1185
1186 \image qrect-intersect.png
1187
1188 \sa intersects(), united(), operator&=()
1189*/
1190
1191/*!
1192 \fn bool QRect::intersects(const QRect &rectangle) const
1193
1194 Returns true if this rectangle intersects with the given \a
1195 rectangle (i.e., there is at least one pixel that is within both
1196 rectangles), otherwise returns false.
1197
1198 The intersection rectangle can be retrieved using the intersected()
1199 function.
1200
1201 \sa contains()
1202*/
1203
1204bool QRect::intersects(const QRect &r) const
1205{
1206 if (isNull() || r.isNull())
1207 return false;
1208
1209 int l1 = x1;
1210 int r1 = x1;
1211 if (x2 - x1 + 1 < 0)
1212 l1 = x2;
1213 else
1214 r1 = x2;
1215
1216 int l2 = r.x1;
1217 int r2 = r.x1;
1218 if (r.x2 - r.x1 + 1 < 0)
1219 l2 = r.x2;
1220 else
1221 r2 = r.x2;
1222
1223 if (l1 > r2 || l2 > r1)
1224 return false;
1225
1226 int t1 = y1;
1227 int b1 = y1;
1228 if (y2 - y1 + 1 < 0)
1229 t1 = y2;
1230 else
1231 b1 = y2;
1232
1233 int t2 = r.y1;
1234 int b2 = r.y1;
1235 if (r.y2 - r.y1 + 1 < 0)
1236 t2 = r.y2;
1237 else
1238 b2 = r.y2;
1239
1240 if (t1 > b2 || t2 > b1)
1241 return false;
1242
1243 return true;
1244}
1245
1246/*!
1247 \fn bool operator==(const QRect &r1, const QRect &r2)
1248 \relates QRect
1249
1250 Returns true if the rectangles \a r1 and \a r2 are equal,
1251 otherwise returns false.
1252*/
1253
1254
1255/*!
1256 \fn bool operator!=(const QRect &r1, const QRect &r2)
1257 \relates QRect
1258
1259 Returns true if the rectangles \a r1 and \a r2 are different, otherwise
1260 returns false.
1261*/
1262
1263
1264/*****************************************************************************
1265 QRect stream functions
1266 *****************************************************************************/
1267#ifndef QT_NO_DATASTREAM
1268/*!
1269 \fn QDataStream &operator<<(QDataStream &stream, const QRect &rectangle)
1270 \relates QRect
1271
1272 Writes the given \a rectangle to the given \a stream, and returns
1273 a reference to the stream.
1274
1275 \sa {Format of the QDataStream Operators}
1276*/
1277
1278QDataStream &operator<<(QDataStream &s, const QRect &r)
1279{
1280 if (s.version() == 1)
1281 s << (qint16)r.left() << (qint16)r.top()
1282 << (qint16)r.right() << (qint16)r.bottom();
1283 else
1284 s << (qint32)r.left() << (qint32)r.top()
1285 << (qint32)r.right() << (qint32)r.bottom();
1286 return s;
1287}
1288
1289/*!
1290 \fn QDataStream &operator>>(QDataStream &stream, QRect &rectangle)
1291 \relates QRect
1292
1293 Reads a rectangle from the given \a stream into the given \a
1294 rectangle, and returns a reference to the stream.
1295
1296 \sa {Format of the QDataStream Operators}
1297*/
1298
1299QDataStream &operator>>(QDataStream &s, QRect &r)
1300{
1301 if (s.version() == 1) {
1302 qint16 x1, y1, x2, y2;
1303 s >> x1; s >> y1; s >> x2; s >> y2;
1304 r.setCoords(x1, y1, x2, y2);
1305 }
1306 else {
1307 qint32 x1, y1, x2, y2;
1308 s >> x1; s >> y1; s >> x2; s >> y2;
1309 r.setCoords(x1, y1, x2, y2);
1310 }
1311 return s;
1312}
1313
1314#endif // QT_NO_DATASTREAM
1315
1316
1317#ifndef QT_NO_DEBUG_STREAM
1318QDebug operator<<(QDebug dbg, const QRect &r) {
1319 dbg.nospace() << "QRect(" << r.x() << ',' << r.y() << ' '
1320 << r.width() << 'x' << r.height() << ')';
1321 return dbg.space();
1322}
1323#endif
1324
1325/*!
1326 \class QRectF
1327 \ingroup painting
1328
1329 \brief The QRectF class defines a rectangle in the plane using floating
1330 point precision.
1331
1332 A rectangle is normally expressed as an upper-left corner and a
1333 size. The size (width and height) of a QRectF is always equivalent
1334 to the mathematical rectangle that forms the basis for its
1335 rendering.
1336
1337 A QRectF can be constructed with a set of left, top, width and
1338 height integers, or from a QPoint and a QSize. The following code
1339 creates two identical rectangles.
1340
1341 \snippet doc/src/snippets/code/src_corelib_tools_qrect.cpp 1
1342
1343 There is also a third constructor creating a QRectF from a QRect,
1344 and a corresponding toRect() function that returns a QRect object
1345 based on the values of this rectangle (note that the coordinates
1346 in the returned rectangle are rounded to the nearest integer).
1347
1348 The QRectF class provides a collection of functions that return
1349 the various rectangle coordinates, and enable manipulation of
1350 these. QRectF also provide functions to move the rectangle
1351 relative to the various coordinates. In addition there is a
1352 moveTo() function that moves the rectangle, leaving its top left
1353 corner at the given coordinates. Alternatively, the translate()
1354 function moves the rectangle the given offset relative to the
1355 current position, and the translated() function returns a
1356 translated copy of this rectangle.
1357
1358 The size() function returns the rectange's dimensions as a
1359 QSize. The dimensions can also be retrieved separately using the
1360 width() and height() functions. To manipulate the dimensions use
1361 the setSize(), setWidth() or setHeight() functions. Alternatively,
1362 the size can be changed by applying either of the functions
1363 setting the rectangle coordinates, for example, setBottom() or
1364 setRight().
1365
1366 The contains() function tells whether a given point is inside the
1367 rectangle or not, and the intersects() function returns true if
1368 this rectangle intersects with a given rectangle (otherwise
1369 false). The QRectF class also provides the intersected() function
1370 which returns the intersection rectangle, and the united() function
1371 which returns the rectangle that encloses the given rectangle and
1372 this:
1373
1374 \table
1375 \row
1376 \o \inlineimage qrect-intersect.png
1377 \o \inlineimage qrect-unite.png
1378 \row
1379 \o intersected()
1380 \o united()
1381 \endtable
1382
1383 The isEmpty() function returns true if the rectangle's width or
1384 height is less than, or equal to, 0. Note that an empty rectangle
1385 is not valid: The isValid() function returns true if both width
1386 and height is larger than 0. A null rectangle (isNull() == true)
1387 on the other hand, has both width and height set to 0.
1388
1389 Note that due to the way QRect and QRectF are defined, an
1390 empty QRectF is defined in essentially the same way as QRect.
1391
1392 Finally, QRectF objects can be streamed as well as compared.
1393
1394 \tableofcontents
1395
1396 \section1 Rendering
1397
1398 When using an \l {QPainter::Antialiasing}{anti-aliased} painter,
1399 the boundary line of a QRectF will be rendered symmetrically on both
1400 sides of the mathematical rectangle's boundary line. But when
1401 using an aliased painter (the default) other rules apply.
1402
1403 Then, when rendering with a one pixel wide pen the QRectF's boundary
1404 line will be rendered to the right and below the mathematical
1405 rectangle's boundary line.
1406
1407 When rendering with a two pixels wide pen the boundary line will
1408 be split in the middle by the mathematical rectangle. This will be
1409 the case whenever the pen is set to an even number of pixels,
1410 while rendering with a pen with an odd number of pixels, the spare
1411 pixel will be rendered to the right and below the mathematical
1412 rectangle as in the one pixel case.
1413
1414 \table
1415 \row
1416 \o \inlineimage qrect-diagram-zero.png
1417 \o \inlineimage qrectf-diagram-one.png
1418 \row
1419 \o Logical representation
1420 \o One pixel wide pen
1421 \row
1422 \o \inlineimage qrectf-diagram-two.png
1423 \o \inlineimage qrectf-diagram-three.png
1424 \row
1425 \o Two pixel wide pen
1426 \o Three pixel wide pen
1427 \endtable
1428
1429 \section1 Coordinates
1430
1431 The QRectF class provides a collection of functions that return
1432 the various rectangle coordinates, and enable manipulation of
1433 these. QRectF also provide functions to move the rectangle
1434 relative to the various coordinates.
1435
1436 For example: the bottom(), setBottom() and moveBottom() functions:
1437 bottom() returns the y-coordinate of the rectangle's bottom edge,
1438 setBottom() sets the bottom edge of the rectangle to the given y
1439 coordinate (it may change the height, but will never change the
1440 rectangle's top edge) and moveBottom() moves the entire rectangle
1441 vertically, leaving the rectangle's bottom edge at the given y
1442 coordinate and its size unchanged.
1443
1444 \image qrectf-coordinates.png
1445
1446 It is also possible to add offsets to this rectangle's coordinates
1447 using the adjust() function, as well as retrieve a new rectangle
1448 based on adjustments of the original one using the adjusted()
1449 function. If either of the width and height is negative, use the
1450 normalized() function to retrieve a rectangle where the corners
1451 are swapped.
1452
1453 In addition, QRectF provides the getCoords() function which extracts
1454 the position of the rectangle's top-left and bottom-right corner,
1455 and the getRect() function which extracts the rectangle's top-left
1456 corner, width and height. Use the setCoords() and setRect()
1457 function to manipulate the rectangle's coordinates and dimensions
1458 in one go.
1459
1460 \sa QRect, QRegion
1461*/
1462
1463/*****************************************************************************
1464 QRectF member functions
1465 *****************************************************************************/
1466
1467/*!
1468 \fn QRectF::QRectF()
1469
1470 Constructs a null rectangle.
1471
1472 \sa isNull()
1473*/
1474
1475/*!
1476 \fn QRectF::QRectF(const QPointF &topLeft, const QSizeF &size)
1477
1478 Constructs a rectangle with the given \a topLeft corner and the given \a size.
1479
1480 \sa setTopLeft(), setSize()
1481*/
1482
1483/*!
1484 \fn QRectF::QRectF(const QPointF &topLeft, const QPointF &bottomRight)
1485 \since 4.3
1486
1487 Constructs a rectangle with the given \a topLeft and \a bottomRight corners.
1488
1489 \sa setTopLeft(), setBottomRight()
1490*/
1491
1492/*!
1493 \fn QRectF::QRectF(qreal x, qreal y, qreal width, qreal height)
1494
1495 Constructs a rectangle with (\a x, \a y) as its top-left corner
1496 and the given \a width and \a height.
1497
1498 \sa setRect()
1499*/
1500
1501/*!
1502 \fn QRectF::QRectF(const QRect &rectangle)
1503
1504 Constructs a QRectF rectangle from the given QRect \a rectangle.
1505
1506 \sa toRect()
1507*/
1508
1509/*!
1510 \fn bool QRectF::isNull() const
1511
1512 Returns true if the rectangle is a null rectangle, otherwise returns false.
1513
1514 A null rectangle has both the width and the height set to 0. A
1515 null rectangle is also empty, and hence not valid.
1516
1517 \sa isEmpty(), isValid()
1518*/
1519
1520/*!
1521 \fn bool QRectF::isEmpty() const
1522
1523 Returns true if the rectangle is empty, otherwise returns false.
1524
1525 An empty rectangle has width() <= 0 or height() <= 0. An empty
1526 rectangle is not valid (i.e., isEmpty() == !isValid()).
1527
1528 Use the normalized() function to retrieve a rectangle where the
1529 corners are swapped.
1530
1531 \sa isNull(), isValid(), normalized()
1532*/
1533
1534/*!
1535 \fn bool QRectF::isValid() const
1536
1537 Returns true if the rectangle is valid, otherwise returns false.
1538
1539 A valid rectangle has a width() > 0 and height() > 0. Note that
1540 non-trivial operations like intersections are not defined for
1541 invalid rectangles. A valid rectangle is not empty (i.e., isValid()
1542 == !isEmpty()).
1543
1544 \sa isNull(), isEmpty(), normalized()
1545*/
1546
1547
1548/*!
1549 Returns a normalized rectangle; i.e., a rectangle that has a
1550 non-negative width and height.
1551
1552 If width() < 0 the function swaps the left and right corners, and
1553 it swaps the top and bottom corners if height() < 0.
1554
1555 \sa isValid(), isEmpty()
1556*/
1557
1558QRectF QRectF::normalized() const
1559{
1560 QRectF r = *this;
1561 if (r.w < 0) {
1562 r.xp += r.w;
1563 r.w = -r.w;
1564 }
1565 if (r.h < 0) {
1566 r.yp += r.h;
1567 r.h = -r.h;
1568 }
1569 return r;
1570}
1571
1572/*!
1573 \fn qreal QRectF::x() const
1574
1575 Returns the x-coordinate of the rectangle's left edge. Equivalent
1576 to left().
1577
1578
1579 \sa setX(), y(), topLeft()
1580*/
1581
1582/*!
1583 \fn qreal QRectF::y() const
1584
1585 Returns the y-coordinate of the rectangle's top edge. Equivalent
1586 to top().
1587
1588 \sa setY(), x(), topLeft()
1589*/
1590
1591
1592/*!
1593 \fn void QRectF::setLeft(qreal x)
1594
1595 Sets the left edge of the rectangle to the given \a x
1596 coordinate. May change the width, but will never change the right
1597 edge of the rectangle.
1598
1599 Equivalent to setX().
1600
1601 \sa left(), moveLeft()
1602*/
1603
1604/*!
1605 \fn void QRectF::setTop(qreal y)
1606
1607 Sets the top edge of the rectangle to the given \a y coordinate. May
1608 change the height, but will never change the bottom edge of the
1609 rectangle.
1610
1611 Equivalent to setY().
1612
1613 \sa top(), moveTop()
1614*/
1615
1616/*!
1617 \fn void QRectF::setRight(qreal x)
1618
1619 Sets the right edge of the rectangle to the given \a x
1620 coordinate. May change the width, but will never change the left
1621 edge of the rectangle.
1622
1623 \sa right(), moveRight()
1624*/
1625
1626/*!
1627 \fn void QRectF::setBottom(qreal y)
1628
1629 Sets the bottom edge of the rectangle to the given \a y
1630 coordinate. May change the height, but will never change the top
1631 edge of the rectangle.
1632
1633 \sa bottom(), moveBottom()
1634*/
1635
1636/*!
1637 \fn void QRectF::setX(qreal x)
1638
1639 Sets the left edge of the rectangle to the given \a x
1640 coordinate. May change the width, but will never change the right
1641 edge of the rectangle.
1642
1643 Equivalent to setLeft().
1644
1645 \sa x(), setY(), setTopLeft()
1646*/
1647
1648/*!
1649 \fn void QRectF::setY(qreal y)
1650
1651 Sets the top edge of the rectangle to the given \a y
1652 coordinate. May change the height, but will never change the
1653 bottom edge of the rectangle.
1654
1655 Equivalent to setTop().
1656
1657 \sa y(), setX(), setTopLeft()
1658*/
1659
1660/*!
1661 \fn void QRectF::setTopLeft(const QPointF &position)
1662
1663 Set the top-left corner of the rectangle to the given \a
1664 position. May change the size, but will never change the
1665 bottom-right corner of the rectangle.
1666
1667 \sa topLeft(), moveTopLeft()
1668*/
1669
1670/*!
1671 \fn void QRectF::setBottomRight(const QPointF &position)
1672
1673 Set the bottom-right corner of the rectangle to the given \a
1674 position. May change the size, but will never change the
1675 top-left corner of the rectangle.
1676
1677 \sa bottomRight(), moveBottomRight()
1678*/
1679
1680/*!
1681 \fn void QRectF::setTopRight(const QPointF &position)
1682
1683 Set the top-right corner of the rectangle to the given \a
1684 position. May change the size, but will never change the
1685 bottom-left corner of the rectangle.
1686
1687 \sa topRight(), moveTopRight()
1688*/
1689
1690/*!
1691 \fn void QRectF::setBottomLeft(const QPointF &position)
1692
1693 Set the bottom-left corner of the rectangle to the given \a
1694 position. May change the size, but will never change the
1695 top-right corner of the rectangle.
1696
1697 \sa bottomLeft(), moveBottomLeft()
1698*/
1699
1700/*!
1701 \fn QPointF QRectF::center() const
1702
1703 Returns the center point of the rectangle.
1704
1705 \sa moveCenter()
1706*/
1707
1708
1709/*!
1710 \fn void QRectF::getRect(qreal *x, qreal *y, qreal *width, qreal *height) const
1711
1712 Extracts the position of the rectangle's top-left corner to *\a x and
1713 *\a y, and its dimensions to *\a width and *\a height.
1714
1715 \sa setRect(), getCoords()
1716*/
1717
1718
1719/*!
1720 \fn void QRectF::getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const
1721
1722 Extracts the position of the rectangle's top-left corner to *\a x1
1723 and *\a y1, and the position of the bottom-right corner to *\a x2 and
1724 *\a y2.
1725
1726 \sa setCoords(), getRect()
1727*/
1728
1729/*!
1730 \fn void QRectF::moveLeft(qreal x)
1731
1732 Moves the rectangle horizontally, leaving the rectangle's left
1733 edge at the given \a x coordinate. The rectangle's size is
1734 unchanged.
1735
1736 \sa left(), setLeft(), moveRight()
1737*/
1738
1739/*!
1740 \fn void QRectF::moveTop(qreal y)
1741
1742 Moves the rectangle vertically, leaving the rectangle's top line
1743 at the given \a y coordinate. The rectangle's size is unchanged.
1744
1745 \sa top(), setTop(), moveBottom()
1746*/
1747
1748
1749/*!
1750 \fn void QRectF::moveRight(qreal x)
1751
1752 Moves the rectangle horizontally, leaving the rectangle's right
1753 edge at the given \a x coordinate. The rectangle's size is
1754 unchanged.
1755
1756 \sa right(), setRight(), moveLeft()
1757*/
1758
1759
1760/*!
1761 \fn void QRectF::moveBottom(qreal y)
1762
1763 Moves the rectangle vertically, leaving the rectangle's bottom
1764 edge at the given \a y coordinate. The rectangle's size is
1765 unchanged.
1766
1767 \sa bottom(), setBottom(), moveTop()
1768*/
1769
1770
1771/*!
1772 \fn void QRectF::moveTopLeft(const QPointF &position)
1773
1774 Moves the rectangle, leaving the top-left corner at the given \a
1775 position. The rectangle's size is unchanged.
1776
1777 \sa setTopLeft(), moveTop(), moveLeft()
1778*/
1779
1780
1781/*!
1782 \fn void QRectF::moveBottomRight(const QPointF &position)
1783
1784 Moves the rectangle, leaving the bottom-right corner at the given
1785 \a position. The rectangle's size is unchanged.
1786
1787 \sa setBottomRight(), moveBottom(), moveRight()
1788*/
1789
1790
1791/*!
1792 \fn void QRectF::moveTopRight(const QPointF &position)
1793
1794 Moves the rectangle, leaving the top-right corner at the given
1795 \a position. The rectangle's size is unchanged.
1796
1797 \sa setTopRight(), moveTop(), moveRight()
1798*/
1799
1800
1801/*!
1802 \fn void QRectF::moveBottomLeft(const QPointF &position)
1803
1804 Moves the rectangle, leaving the bottom-left corner at the given
1805 \a position. The rectangle's size is unchanged.
1806
1807 \sa setBottomLeft(), moveBottom(), moveLeft()
1808*/
1809
1810
1811/*!
1812 \fn void QRectF::moveTo(qreal x, qreal y)
1813
1814 Moves the rectangle, leaving the top-left corner at the given
1815 position (\a x, \a y). The rectangle's size is unchanged.
1816
1817 \sa translate(), moveTopLeft()
1818*/
1819
1820/*!
1821 \fn void QRectF::moveTo(const QPointF &position)
1822 \overload
1823
1824 Moves the rectangle, leaving the top-left corner at the given \a
1825 position.
1826*/
1827
1828/*!
1829 \fn void QRectF::translate(qreal dx, qreal dy)
1830
1831 Moves the rectangle \a dx along the x-axis and \a dy along the y-axis,
1832 relative to the current position. Positive values move the rectangle to the
1833 right and downwards.
1834
1835 \sa moveTopLeft(), moveTo(), translated()
1836*/
1837
1838
1839/*!
1840 \fn void QRectF::translate(const QPointF &offset)
1841 \overload
1842
1843 Moves the rectangle \a{offset}.\l{QPointF::x()}{x()} along the x
1844 axis and \a{offset}.\l{QPointF::y()}{y()} along the y axis,
1845 relative to the current position.
1846*/
1847
1848
1849/*!
1850 \fn QRectF QRectF::translated(qreal dx, qreal dy) const
1851
1852 Returns a copy of the rectangle that is translated \a dx along the
1853 x axis and \a dy along the y axis, relative to the current
1854 position. Positive values move the rectangle to the right and
1855 down.
1856
1857 \sa translate()
1858*/
1859
1860
1861/*!
1862 \fn QRectF QRectF::translated(const QPointF &offset) const
1863 \overload
1864
1865 Returns a copy of the rectangle that is translated
1866 \a{offset}.\l{QPointF::x()}{x()} along the x axis and
1867 \a{offset}.\l{QPointF::y()}{y()} along the y axis, relative to the
1868 current position.
1869*/
1870
1871
1872/*!
1873 \fn void QRectF::setRect(qreal x, qreal y, qreal width, qreal height)
1874
1875 Sets the coordinates of the rectangle's top-left corner to (\a x,
1876 \a y), and its size to the given \a width and \a height.
1877
1878 \sa getRect(), setCoords()
1879*/
1880
1881
1882/*!
1883 \fn void QRectF::setCoords(qreal x1, qreal y1, qreal x2, qreal y2)
1884
1885 Sets the coordinates of the rectangle's top-left corner to (\a x1,
1886 \a y1), and the coordinates of its bottom-right corner to (\a x2,
1887 \a y2).
1888
1889 \sa getCoords() setRect()
1890*/
1891
1892/*!
1893 \fn QRectF QRectF::adjusted(qreal dx1, qreal dy1, qreal dx2, qreal dy2) const
1894
1895 Returns a new rectangle with \a dx1, \a dy1, \a dx2 and \a dy2
1896 added respectively to the existing coordinates of this rectangle.
1897
1898 \sa adjust()
1899*/
1900
1901/*! \fn void QRectF::adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
1902
1903 Adds \a dx1, \a dy1, \a dx2 and \a dy2 respectively to the
1904 existing coordinates of the rectangle.
1905
1906 \sa adjusted(), setRect()
1907*/
1908/*!
1909 \fn QSizeF QRectF::size() const
1910
1911 Returns the size of the rectangle.
1912
1913 \sa setSize(), width(), height()
1914*/
1915
1916/*!
1917 \fn qreal QRectF::width() const
1918
1919 Returns the width of the rectangle.
1920
1921 \sa setWidth(), height(), size()
1922*/
1923
1924/*!
1925 \fn qreal QRectF::height() const
1926
1927 Returns the height of the rectangle.
1928
1929 \sa setHeight(), width(), size()
1930*/
1931
1932/*!
1933 \fn void QRectF::setWidth(qreal width)
1934
1935 Sets the width of the rectangle to the given \a width. The right
1936 edge is changed, but not the left one.
1937
1938 \sa width(), setSize()
1939*/
1940
1941
1942/*!
1943 \fn void QRectF::setHeight(qreal height)
1944
1945 Sets the height of the rectangle to the given \a height. The bottom
1946 edge is changed, but not the top one.
1947
1948 \sa height(), setSize()
1949*/
1950
1951
1952/*!
1953 \fn void QRectF::setSize(const QSizeF &size)
1954
1955 Sets the size of the rectangle to the given \a size. The top-left
1956 corner is not moved.
1957
1958 \sa size(), setWidth(), setHeight()
1959*/
1960
1961
1962/*!
1963 \fn bool QRectF::contains(const QPointF &point) const
1964
1965 Returns true if the given \a point is inside or on the edge of the
1966 rectangle; otherwise returns false.
1967
1968 \sa intersects()
1969*/
1970
1971bool QRectF::contains(const QPointF &p) const
1972{
1973 qreal l = xp;
1974 qreal r = xp;
1975 if (w < 0)
1976 l += w;
1977 else
1978 r += w;
1979 if (l == r) // null rect
1980 return false;
1981
1982 if (p.x() < l || p.x() > r)
1983 return false;
1984
1985 qreal t = yp;
1986 qreal b = yp;
1987 if (h < 0)
1988 t += h;
1989 else
1990 b += h;
1991 if (t == b) // null rect
1992 return false;
1993
1994 if (p.y() < t || p.y() > b)
1995 return false;
1996
1997 return true;
1998}
1999
2000
2001/*!
2002 \fn bool QRectF::contains(qreal x, qreal y) const
2003 \overload
2004
2005 Returns true if the point (\a x, \a y) is inside or on the edge of
2006 the rectangle; otherwise returns false.
2007*/
2008
2009/*!
2010 \fn bool QRectF::contains(const QRectF &rectangle) const
2011 \overload
2012
2013 Returns true if the given \a rectangle is inside this rectangle;
2014 otherwise returns false.
2015*/
2016
2017bool QRectF::contains(const QRectF &r) const
2018{
2019 qreal l1 = xp;
2020 qreal r1 = xp;
2021 if (w < 0)
2022 l1 += w;
2023 else
2024 r1 += w;
2025 if (l1 == r1) // null rect
2026 return false;
2027
2028 qreal l2 = r.xp;
2029 qreal r2 = r.xp;
2030 if (r.w < 0)
2031 l2 += r.w;
2032 else
2033 r2 += r.w;
2034 if (l2 == r2) // null rect
2035 return false;
2036
2037 if (l2 < l1 || r2 > r1)
2038 return false;
2039
2040 qreal t1 = yp;
2041 qreal b1 = yp;
2042 if (h < 0)
2043 t1 += h;
2044 else
2045 b1 += h;
2046 if (t1 == b1) // null rect
2047 return false;
2048
2049 qreal t2 = r.yp;
2050 qreal b2 = r.yp;
2051 if (r.h < 0)
2052 t2 += r.h;
2053 else
2054 b2 += r.h;
2055 if (t2 == b2) // null rect
2056 return false;
2057
2058 if (t2 < t1 || b2 > b1)
2059 return false;
2060
2061 return true;
2062}
2063
2064/*!
2065 \fn qreal QRectF::left() const
2066
2067 Returns the x-coordinate of the rectangle's left edge. Equivalent
2068 to x().
2069
2070 \sa setLeft(), topLeft(), bottomLeft()
2071*/
2072
2073/*!
2074 \fn qreal QRectF::top() const
2075
2076 Returns the y-coordinate of the rectangle's top edge. Equivalent
2077 to y().
2078
2079 \sa setTop(), topLeft(), topRight()
2080*/
2081
2082/*!
2083 \fn qreal QRectF::right() const
2084
2085 Returns the x-coordinate of the rectangle's right edge.
2086
2087 \sa setRight(), topRight(), bottomRight()
2088*/
2089
2090/*!
2091 \fn qreal QRectF::bottom() const
2092
2093 Returns the y-coordinate of the rectangle's bottom edge.
2094
2095 \sa setBottom(), bottomLeft(), bottomRight()
2096*/
2097
2098/*!
2099 \fn QPointF QRectF::topLeft() const
2100
2101 Returns the position of the rectangle's top-left corner.
2102
2103 \sa setTopLeft(), top(), left()
2104*/
2105
2106/*!
2107 \fn QPointF QRectF::bottomRight() const
2108
2109 Returns the position of the rectangle's bottom-right corner.
2110
2111 \sa setBottomRight(), bottom(), right()
2112*/
2113
2114/*!
2115 \fn QPointF QRectF::topRight() const
2116
2117 Returns the position of the rectangle's top-right corner.
2118
2119 \sa setTopRight(), top(), right()
2120*/
2121
2122/*!
2123 \fn QPointF QRectF::bottomLeft() const
2124
2125 Returns the position of the rectangle's bottom-left corner.
2126
2127 \sa setBottomLeft(), bottom(), left()
2128*/
2129
2130/*!
2131 \fn QRectF& QRectF::operator|=(const QRectF &rectangle)
2132
2133 Unites this rectangle with the given \a rectangle.
2134
2135 \sa united(), operator|()
2136*/
2137
2138/*!
2139 \fn QRectF& QRectF::operator&=(const QRectF &rectangle)
2140
2141 Intersects this rectangle with the given \a rectangle.
2142
2143 \sa intersected(), operator|=()
2144*/
2145
2146
2147/*!
2148 \fn QRectF QRectF::operator|(const QRectF &rectangle) const
2149
2150 Returns the bounding rectangle of this rectangle and the given \a rectangle.
2151
2152 \sa united(), operator|=()
2153*/
2154
2155QRectF QRectF::operator|(const QRectF &r) const
2156{
2157 if (isNull())
2158 return r;
2159 if (r.isNull())
2160 return *this;
2161
2162 qreal left = xp;
2163 qreal right = xp;
2164 if (w < 0)
2165 left += w;
2166 else
2167 right += w;
2168
2169 if (r.w < 0) {
2170 left = qMin(left, r.xp + r.w);
2171 right = qMax(right, r.xp);
2172 } else {
2173 left = qMin(left, r.xp);
2174 right = qMax(right, r.xp + r.w);
2175 }
2176
2177 qreal top = yp;
2178 qreal bottom = yp;
2179 if (h < 0)
2180 top += h;
2181 else
2182 bottom += h;
2183
2184 if (r.h < 0) {
2185 top = qMin(top, r.yp + r.h);
2186 bottom = qMax(bottom, r.yp);
2187 } else {
2188 top = qMin(top, r.yp);
2189 bottom = qMax(bottom, r.yp + r.h);
2190 }
2191
2192 return QRectF(left, top, right - left, bottom - top);
2193}
2194
2195/*!
2196 \fn QRectF QRectF::unite(const QRectF &rectangle) const
2197 \obsolete
2198
2199 Use united(\a rectangle) instead.
2200*/
2201
2202/*!
2203 \fn QRectF QRectF::united(const QRectF &rectangle) const
2204 \since 4.2
2205
2206 Returns the bounding rectangle of this rectangle and the given \a
2207 rectangle.
2208
2209 \image qrect-unite.png
2210
2211 \sa intersected()
2212*/
2213
2214
2215/*!
2216 \fn QRectF QRectF::operator &(const QRectF &rectangle) const
2217
2218 Returns the intersection of this rectangle and the given \a
2219 rectangle. Returns an empty rectangle if there is no intersection.
2220
2221 \sa operator&=(), intersected()
2222*/
2223
2224QRectF QRectF::operator&(const QRectF &r) const
2225{
2226 qreal l1 = xp;
2227 qreal r1 = xp;
2228 if (w < 0)
2229 l1 += w;
2230 else
2231 r1 += w;
2232 if (l1 == r1) // null rect
2233 return QRectF();
2234
2235 qreal l2 = r.xp;
2236 qreal r2 = r.xp;
2237 if (r.w < 0)
2238 l2 += r.w;
2239 else
2240 r2 += r.w;
2241 if (l2 == r2) // null rect
2242 return QRectF();
2243
2244 if (l1 >= r2 || l2 >= r1)
2245 return QRectF();
2246
2247 qreal t1 = yp;
2248 qreal b1 = yp;
2249 if (h < 0)
2250 t1 += h;
2251 else
2252 b1 += h;
2253 if (t1 == b1) // null rect
2254 return QRectF();
2255
2256 qreal t2 = r.yp;
2257 qreal b2 = r.yp;
2258 if (r.h < 0)
2259 t2 += r.h;
2260 else
2261 b2 += r.h;
2262 if (t2 == b2) // null rect
2263 return QRectF();
2264
2265 if (t1 >= b2 || t2 >= b1)
2266 return QRectF();
2267
2268 QRectF tmp;
2269 tmp.xp = qMax(l1, l2);
2270 tmp.yp = qMax(t1, t2);
2271 tmp.w = qMin(r1, r2) - tmp.xp;
2272 tmp.h = qMin(b1, b2) - tmp.yp;
2273 return tmp;
2274}
2275
2276/*!
2277 \fn QRectF QRectF::intersect(const QRectF &rectangle) const
2278 \obsolete
2279
2280 Use intersected(\a rectangle) instead.
2281*/
2282
2283/*!
2284 \fn QRectF QRectF::intersected(const QRectF &rectangle) const
2285 \since 4.2
2286
2287 Returns the intersection of this rectangle and the given \a
2288 rectangle. Note that \c {r.intersected(s)} is equivalent to \c
2289 {r & s}.
2290
2291 \image qrect-intersect.png
2292
2293 \sa intersects(), united(), operator&=()
2294*/
2295
2296/*!
2297 \fn bool QRectF::intersects(const QRectF &rectangle) const
2298
2299 Returns true if this rectangle intersects with the given \a
2300 rectangle (i.e. there is a non-empty area of overlap between
2301 them), otherwise returns false.
2302
2303 The intersection rectangle can be retrieved using the intersected()
2304 function.
2305
2306 \sa contains()
2307*/
2308
2309bool QRectF::intersects(const QRectF &r) const
2310{
2311 qreal l1 = xp;
2312 qreal r1 = xp;
2313 if (w < 0)
2314 l1 += w;
2315 else
2316 r1 += w;
2317 if (l1 == r1) // null rect
2318 return false;
2319
2320 qreal l2 = r.xp;
2321 qreal r2 = r.xp;
2322 if (r.w < 0)
2323 l2 += r.w;
2324 else
2325 r2 += r.w;
2326 if (l2 == r2) // null rect
2327 return false;
2328
2329 if (l1 >= r2 || l2 >= r1)
2330 return false;
2331
2332 qreal t1 = yp;
2333 qreal b1 = yp;
2334 if (h < 0)
2335 t1 += h;
2336 else
2337 b1 += h;
2338 if (t1 == b1) // null rect
2339 return false;
2340
2341 qreal t2 = r.yp;
2342 qreal b2 = r.yp;
2343 if (r.h < 0)
2344 t2 += r.h;
2345 else
2346 b2 += r.h;
2347 if (t2 == b2) // null rect
2348 return false;
2349
2350 if (t1 >= b2 || t2 >= b1)
2351 return false;
2352
2353 return true;
2354}
2355
2356/*!
2357 \fn QRect QRectF::toRect() const
2358
2359 Returns a QRect based on the values of this rectangle. Note that the
2360 coordinates in the returned rectangle are rounded to the nearest integer.
2361
2362 \sa QRectF(), toAlignedRect()
2363*/
2364
2365/*!
2366 \fn QRect QRectF::toAlignedRect() const
2367 \since 4.3
2368
2369 Returns a QRect based on the values of this rectangle that is the
2370 smallest possible integer rectangle that completely contains this
2371 rectangle.
2372
2373 \sa toRect()
2374*/
2375
2376QRect QRectF::toAlignedRect() const
2377{
2378 int xmin = int(qFloor(xp));
2379 int xmax = int(qCeil(xp + w));
2380 int ymin = int(qFloor(yp));
2381 int ymax = int(qCeil(yp + h));
2382 return QRect(xmin, ymin, xmax - xmin, ymax - ymin);
2383}
2384
2385/*!
2386 \fn void QRectF::moveCenter(const QPointF &position)
2387
2388 Moves the rectangle, leaving the center point at the given \a
2389 position. The rectangle's size is unchanged.
2390
2391 \sa center()
2392*/
2393
2394/*!
2395 \fn bool operator==(const QRectF &r1, const QRectF &r2)
2396 \relates QRectF
2397
2398 Returns true if the rectangles \a r1 and \a r2 are equal,
2399 otherwise returns false.
2400*/
2401
2402
2403/*!
2404 \fn bool operator!=(const QRectF &r1, const QRectF &r2)
2405 \relates QRectF
2406
2407 Returns true if the rectangles \a r1 and \a r2 are different, otherwise
2408 returns false.
2409*/
2410
2411/*****************************************************************************
2412 QRectF stream functions
2413 *****************************************************************************/
2414#ifndef QT_NO_DATASTREAM
2415/*!
2416 \fn QDataStream &operator<<(QDataStream &stream, const QRectF &rectangle)
2417
2418 \relates QRectF
2419
2420 Writes the \a rectangle to the \a stream, and returns a reference to the
2421 stream.
2422
2423 \sa \link datastreamformat.html Format of the QDataStream operators \endlink
2424*/
2425
2426QDataStream &operator<<(QDataStream &s, const QRectF &r)
2427{
2428 s << double(r.x()) << double(r.y()) << double(r.width()) << double(r.height());
2429 return s;
2430}
2431
2432/*!
2433 \fn QDataStream &operator>>(QDataStream &stream, QRectF &rectangle)
2434
2435 \relates QRectF
2436
2437 Reads a \a rectangle from the \a stream, and returns a reference to the
2438 stream.
2439
2440 \sa \link datastreamformat.html Format of the QDataStream operators \endlink
2441*/
2442
2443QDataStream &operator>>(QDataStream &s, QRectF &r)
2444{
2445 double x, y, w, h;
2446 s >> x;
2447 s >> y;
2448 s >> w;
2449 s >> h;
2450 r.setRect(qreal(x), qreal(y), qreal(w), qreal(h));
2451 return s;
2452}
2453
2454#endif // QT_NO_DATASTREAM
2455
2456
2457#ifndef QT_NO_DEBUG_STREAM
2458QDebug operator<<(QDebug dbg, const QRectF &r) {
2459 dbg.nospace() << "QRectF(" << r.x() << ',' << r.y() << ' '
2460 << r.width() << 'x' << r.height() << ')';
2461 return dbg.space();
2462}
2463#endif
2464
2465QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.