14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
189
190
191QPenPrivate::QPenPrivate(
const QBrush &_brush, qreal _width, Qt::PenStyle penStyle,
192 Qt::PenCapStyle _capStyle, Qt::PenJoinStyle _joinStyle)
193 : dashOffset(0), miterLimit(2),
199 capStyle = _capStyle;
200 joinStyle = _joinStyle;
211 Qt::PenCapStyle penCapStyle, Qt::PenJoinStyle _joinStyle)
218Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, defaultPenInstance,
219 (Qt::black, 1, Qt::SolidLine, qpen_default_cap, qpen_default_join))
220Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, nullPenInstance,
221 (Qt::black, 1, Qt::NoPen, qpen_default_cap, qpen_default_join))
224
225
229 d = defaultPenInstance()->pen;
233
234
235
236
238QPen::QPen(Qt::PenStyle style)
240 if (style == Qt::NoPen) {
241 d = nullPenInstance()->pen;
243 d =
new QPenPrivate(Qt::black, 1, style, qpen_default_cap, qpen_default_join);
249
250
251
252
254QPen::QPen(
const QColor &color)
256 d =
new QPenPrivate(color, 1, Qt::SolidLine, qpen_default_cap, qpen_default_join);
261
262
263
264
265
266
267
269QPen::QPen(
const QBrush &brush, qreal width, Qt::PenStyle s, Qt::PenCapStyle c, Qt::PenJoinStyle j)
271 d =
new QPenPrivate(brush, width, s, c, j);
275
276
277
278
280QPen::QPen(
const QPen &p)
noexcept
287
288
289
290
291
292
293
294
295
298
299
301QPen::~QPen() =
default;
303QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QPenPrivate)
306
307
308
309
310
311
312
313
322
323
324
325
326
328QPen &QPen::operator=(
const QPen &p)
noexcept
335
336
337
338
339
340
343
344
345
346
349
350
351
352
353
354
355QPen &QPen::operator=(QColor color)
360 d->style = Qt::SolidLine;
361 d->capStyle = qpen_default_cap;
362 d->joinStyle = qpen_default_join;
368
369
370
371
372
373
374QPen &QPen::operator=(Qt::PenStyle style)
377 if (style == Qt::NoPen) {
378 d = nullPenInstance()->pen;
380 d->brush = Qt::black;
383 d->capStyle = qpen_default_cap;
384 d->joinStyle = qpen_default_join;
390
391
392QPen::operator QVariant()
const
394 return QVariant::fromValue(*
this);
398
399
400
401
402
403
404Qt::PenStyle QPen::style()
const
409
410
411
412
413
414
415
416
417
418
419
420
421
423void QPen::setStyle(Qt::PenStyle s)
429 d->dashPattern.clear();
434
435
436
437
438QList<qreal> QPen::dashPattern()
const
440 if (d->style == Qt::SolidLine || d->style == Qt::NoPen) {
441 return QList<qreal>();
442 }
else if (d->dashPattern.isEmpty()) {
443 const qreal space = 2;
445 const qreal dash = 4;
449 d->dashPattern.reserve(2);
450 d->dashPattern << dash << space;
453 d->dashPattern.reserve(2);
454 d->dashPattern << dot << space;
456 case Qt::DashDotLine:
457 d->dashPattern.reserve(4);
458 d->dashPattern << dash << space << dot << space;
460 case Qt::DashDotDotLine:
461 d->dashPattern.reserve(6);
462 d->dashPattern << dash << space << dot << space << dot << space;
468 return d->dashPattern;
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501void QPen::setDashPattern(
const QList<qreal> &pattern)
503 if (pattern.isEmpty())
507 d->dashPattern = pattern;
508 d->style = Qt::CustomDashLine;
510 if ((d->dashPattern.size() % 2) == 1) {
511 qWarning(
"QPen::setDashPattern: Pattern not of even length");
518
519
520
521
522qreal QPen::dashOffset()
const
524 return d->dashOffset;
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544void QPen::setDashOffset(qreal offset)
546 if (qFuzzyCompare(offset, d->dashOffset))
549 d->dashOffset = offset;
550 if (d->style != Qt::CustomDashLine) {
551 d->dashPattern = dashPattern();
552 d->style = Qt::CustomDashLine;
557
558
559
560
561
562qreal QPen::miterLimit()
const
564 return d->miterLimit;
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583void QPen::setMiterLimit(qreal limit)
586 d->miterLimit = limit;
591
592
593
594
595
596
598int QPen::width()
const
600 return qRound(d->width);
604
605
606
607
608
609
610qreal QPen::widthF()
const
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630void QPen::setWidth(
int width)
632 if (width < 0 || width >= (1 << 15)) {
633 qWarning(
"QPen::setWidth: Setting a pen width that is out of range");
636 if ((qreal)width == d->width)
643
644
645
646
647
648
649
650
651
652
653
654
656void QPen::setWidthF(qreal width)
658 if (width < 0.f || width >= (1 << 15)) {
659 qWarning(
"QPen::setWidthF: Setting a pen width that is out of range");
662 if (qAbs(d->width - width) < 0.00000001f)
670
671
672
673
674Qt::PenCapStyle QPen::capStyle()
const
680
681
682
683
684
685
686
688void QPen::setCapStyle(Qt::PenCapStyle c)
690 if (d->capStyle == c)
697
698
699
700
701Qt::PenJoinStyle QPen::joinStyle()
const
707
708
709
710
711
712
713
715void QPen::setJoinStyle(Qt::PenJoinStyle j)
717 if (d->joinStyle == j)
724
725
726
727
728
729
730QColor QPen::color()
const
732 return d->brush.color();
736
737
738
739
740
741
743void QPen::setColor(
const QColor &c)
746 d->brush = QBrush(c);
751
752
753QBrush QPen::brush()
const
759
760
761
762
763
764void QPen::setBrush(
const QBrush &brush)
772
773
774
775
776bool QPen::isSolid()
const
778 return d->brush.style() == Qt::SolidPattern;
783
784
785
786
787
788
789
790
791
792
793
795bool QPen::isCosmetic()
const
797 return (d->cosmetic ==
true) || d->width == 0;
802
803
804
805
806
808void QPen::setCosmetic(
bool cosmetic)
811 d->cosmetic = cosmetic;
815
816
817bool QPen::isSolidDefaultLine()
const noexcept
819 return d->style == Qt::SolidLine && d->width == 1
820 && d->capStyle == qpen_default_cap && d->joinStyle == qpen_default_join
821 && qFuzzyCompare(d->dashOffset, 0) && qFuzzyCompare(d->miterLimit, 2)
822 && d->cosmetic ==
false;
826
827
828
829
830
831
832
833
836
837
838
839
840
841
842
843
845bool QPen::operator==(
const QPen &p)
const
848 || (p.d->style == d->style
849 && p.d->capStyle == d->capStyle
850 && p.d->joinStyle == d->joinStyle
851 && p.d->width == d->width
852 && p.d->miterLimit == d->miterLimit
853 && (d->style != Qt::CustomDashLine
854 || (qFuzzyCompare(p.d->dashOffset, d->dashOffset) &&
855 p.d->dashPattern == d->dashPattern))
856 && p.d->brush == d->brush
857 && p.d->cosmetic == d->cosmetic);
861
862
863bool QPen::doCompareEqualColor(QColor rhs)
const noexcept
865 return d->brush == rhs && isSolidDefaultLine();
869
870
871bool QPen::doCompareEqualStyle(Qt::PenStyle rhs)
const
873 if (rhs == Qt::NoPen)
874 return style() == Qt::NoPen;
875 return *
this == QPen(rhs);
879
880
881
882
884bool QPen::isDetached()
886 return d->ref.loadRelaxed() == 1;
891
892
893#ifndef QT_NO_DATASTREAM
895
896
897
898
899
900
901
902
904QDataStream &operator<<(QDataStream &s,
const QPen &p)
906 if (s.version() < 3) {
907 s << (quint8)p.style();
908 }
else if (s.version() < QDataStream::Qt_4_3) {
909 s << (quint8)(uint(p.style()) | uint(p.capStyle()) | uint(p.joinStyle()));
911 s << (quint16)(uint(p.style()) | uint(p.capStyle()) | uint(p.joinStyle()));
912 s << (
bool)(p.d->cosmetic);
915 if (s.version() < 7) {
916 s << (quint8)p.width();
919 s <<
double(p.widthF());
921 s <<
double(p.miterLimit());
922 if (
sizeof(qreal) ==
sizeof(
double)) {
923 s << p.dashPattern();
928 QList<qreal> pattern = p.dashPattern();
929 s << quint32(pattern.size());
930 for (
int i = 0; i < pattern.size(); ++i)
931 s <<
double(pattern.at(i));
933 if (s.version() >= 9)
934 s <<
double(p.dashOffset());
935 if (s.version() >= QDataStream::Qt_5_0)
936 s <<
bool(qFuzzyIsNull(p.widthF()));
942
943
944
945
946
947
948
949
958 double miterLimit = 2;
959 QList<qreal> dashPattern;
960 double dashOffset = 0;
961 bool cosmetic =
false;
963 if (s.version() < QDataStream::Qt_4_3) {
971 if (s.version() < 7) {
980 if (
sizeof(qreal) ==
sizeof(
double)) {
986 dashPattern.reserve(numDashes);
987 for (quint32 i = 0; i < numDashes; ++i) {
992 if (s.version() >= 9)
996 if (s.version() >= QDataStream::Qt_5_0) {
1003 p.d->style = Qt::PenStyle(style & Qt::MPenStyle);
1004 p.d->capStyle = Qt::PenCapStyle(style & Qt::MPenCapStyle);
1005 p.d->joinStyle = Qt::PenJoinStyle(style & Qt::MPenJoinStyle);
1006 p.d->dashPattern = dashPattern;
1007 p.d->miterLimit = miterLimit;
1008 p.d->dashOffset = dashOffset;
1009 p.d->cosmetic = cosmetic;
1015#ifndef QT_NO_DEBUG_STREAM
1018 QDebugStateSaver saver(dbg);
1019 dbg.nospace() <<
"QPen(" << p.width() <<
',' << p.brush()
1020 <<
',' << p.style() <<
',' << p.capStyle()
1021 <<
',' << p.joinStyle() <<
',' << p.dashPattern()
1022 <<
',' << p.dashOffset()
1023 <<
',' << p.miterLimit() <<
')';
1029
1030
1031
1034
1035
1036
1037
1041#undef QT_COMPILING_QPEN
QPenDataHolder(const QBrush &brush, qreal width, Qt::PenStyle penStyle, Qt::PenCapStyle penCapStyle, Qt::PenJoinStyle _joinStyle)
~QPenDataHolder()=default
QDebug operator<<(QDebug dbg, const QPen &p)
static constexpr Qt::PenJoinStyle qpen_default_join
static constexpr Qt::PenCapStyle qpen_default_cap
QDataStream & operator>>(QDataStream &s, QPen &p)