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
188
189
190QPenPrivate::QPenPrivate(
const QBrush &_brush, qreal _width, Qt::PenStyle penStyle,
191 Qt::PenCapStyle _capStyle, Qt::PenJoinStyle _joinStyle)
192 : dashOffset(0), miterLimit(2),
198 capStyle = _capStyle;
199 joinStyle = _joinStyle;
210 Qt::PenCapStyle penCapStyle, Qt::PenJoinStyle _joinStyle)
217Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, defaultPenInstance,
218 (Qt::black, 1, Qt::SolidLine, qpen_default_cap, qpen_default_join))
219Q_GLOBAL_STATIC_WITH_ARGS(QPenDataHolder, nullPenInstance,
220 (Qt::black, 1, Qt::NoPen, qpen_default_cap, qpen_default_join))
223
224
228 d = defaultPenInstance()->pen;
232
233
234
235
237QPen::QPen(Qt::PenStyle style)
239 if (style == Qt::NoPen) {
240 d = nullPenInstance()->pen;
242 d =
new QPenPrivate(Qt::black, 1, style, qpen_default_cap, qpen_default_join);
248
249
250
251
253QPen::QPen(
const QColor &color)
255 d =
new QPenPrivate(color, 1, Qt::SolidLine, qpen_default_cap, qpen_default_join);
260
261
262
263
264
265
266
268QPen::QPen(
const QBrush &brush, qreal width, Qt::PenStyle s, Qt::PenCapStyle c, Qt::PenJoinStyle j)
270 d =
new QPenPrivate(brush, width, s, c, j);
274
275
276
277
279QPen::QPen(
const QPen &p)
noexcept
286
287
288
289
290
291
292
293
294
297
298
300QPen::~QPen() =
default;
302QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QPenPrivate)
305
306
307
308
309
310
311
312
321
322
323
324
325
327QPen &QPen::operator=(
const QPen &p)
noexcept
334
335
336
337
338
339
342
343
344
345
348
349
350
351
352
353
354QPen &QPen::operator=(QColor color)
359 d->style = Qt::SolidLine;
360 d->capStyle = qpen_default_cap;
361 d->joinStyle = qpen_default_join;
367
368
369
370
371
372
373QPen &QPen::operator=(Qt::PenStyle style)
376 if (style == Qt::NoPen) {
377 d = nullPenInstance()->pen;
379 d->brush = Qt::black;
382 d->capStyle = qpen_default_cap;
383 d->joinStyle = qpen_default_join;
389
390
391QPen::operator QVariant()
const
393 return QVariant::fromValue(*
this);
397
398
399
400
401
402
403Qt::PenStyle QPen::style()
const
408
409
410
411
412
413
414
415
416
417
418
419
420
422void QPen::setStyle(Qt::PenStyle s)
428 d->dashPattern.clear();
433
434
435
436
437QList<qreal> QPen::dashPattern()
const
439 if (d->style == Qt::SolidLine || d->style == Qt::NoPen) {
440 return QList<qreal>();
441 }
else if (d->dashPattern.isEmpty()) {
442 const qreal space = 2;
444 const qreal dash = 4;
448 d->dashPattern.reserve(2);
449 d->dashPattern << dash << space;
452 d->dashPattern.reserve(2);
453 d->dashPattern << dot << space;
455 case Qt::DashDotLine:
456 d->dashPattern.reserve(4);
457 d->dashPattern << dash << space << dot << space;
459 case Qt::DashDotDotLine:
460 d->dashPattern.reserve(6);
461 d->dashPattern << dash << space << dot << space << dot << space;
467 return d->dashPattern;
471
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
500void QPen::setDashPattern(
const QList<qreal> &pattern)
502 if (pattern.isEmpty())
506 d->dashPattern = pattern;
507 d->style = Qt::CustomDashLine;
509 if ((d->dashPattern.size() % 2) == 1) {
510 qWarning(
"QPen::setDashPattern: Pattern not of even length");
517
518
519
520
521qreal QPen::dashOffset()
const
523 return d->dashOffset;
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543void QPen::setDashOffset(qreal offset)
545 if (qFuzzyCompare(offset, d->dashOffset))
548 d->dashOffset = offset;
549 if (d->style != Qt::CustomDashLine) {
550 d->dashPattern = dashPattern();
551 d->style = Qt::CustomDashLine;
556
557
558
559
560
561qreal QPen::miterLimit()
const
563 return d->miterLimit;
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582void QPen::setMiterLimit(qreal limit)
585 d->miterLimit = limit;
590
591
592
593
594
595
597int QPen::width()
const
599 return qRound(d->width);
603
604
605
606
607
608
609qreal QPen::widthF()
const
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629void QPen::setWidth(
int width)
631 if (width < 0 || width >= (1 << 15)) {
632 qWarning(
"QPen::setWidth: Setting a pen width that is out of range");
635 if ((qreal)width == d->width)
642
643
644
645
646
647
648
649
650
651
652
653
655void QPen::setWidthF(qreal width)
657 if (width < 0.f || width >= (1 << 15)) {
658 qWarning(
"QPen::setWidthF: Setting a pen width that is out of range");
661 if (qAbs(d->width - width) < 0.00000001f)
669
670
671
672
673Qt::PenCapStyle QPen::capStyle()
const
679
680
681
682
683
684
685
687void QPen::setCapStyle(Qt::PenCapStyle c)
689 if (d->capStyle == c)
696
697
698
699
700Qt::PenJoinStyle QPen::joinStyle()
const
706
707
708
709
710
711
712
714void QPen::setJoinStyle(Qt::PenJoinStyle j)
716 if (d->joinStyle == j)
723
724
725
726
727
728
729QColor QPen::color()
const
731 return d->brush.color();
735
736
737
738
739
740
742void QPen::setColor(
const QColor &c)
745 d->brush = QBrush(c);
750
751
752QBrush QPen::brush()
const
758
759
760
761
762
763void QPen::setBrush(
const QBrush &brush)
771
772
773
774
775bool QPen::isSolid()
const
777 return d->brush.style() == Qt::SolidPattern;
782
783
784
785
786
787
788
789
790
791
792
794bool QPen::isCosmetic()
const
796 return (d->cosmetic ==
true) || d->width == 0;
801
802
803
804
805
807void QPen::setCosmetic(
bool cosmetic)
810 d->cosmetic = cosmetic;
814
815
816bool QPen::isSolidDefaultLine()
const noexcept
818 return d->style == Qt::SolidLine && d->width == 1
819 && d->capStyle == qpen_default_cap && d->joinStyle == qpen_default_join
820 && qFuzzyCompare(d->dashOffset, 0) && qFuzzyCompare(d->miterLimit, 2)
821 && d->cosmetic ==
false;
825
826
827
828
829
830
831
832
835
836
837
838
839
840
841
842
844bool QPen::operator==(
const QPen &p)
const
847 || (p.d->style == d->style
848 && p.d->capStyle == d->capStyle
849 && p.d->joinStyle == d->joinStyle
850 && p.d->width == d->width
851 && p.d->miterLimit == d->miterLimit
852 && (d->style != Qt::CustomDashLine
853 || (qFuzzyCompare(p.d->dashOffset, d->dashOffset) &&
854 p.d->dashPattern == d->dashPattern))
855 && p.d->brush == d->brush
856 && p.d->cosmetic == d->cosmetic);
860
861
862bool QPen::doCompareEqualColor(QColor rhs)
const noexcept
864 return d->brush == rhs && isSolidDefaultLine();
868
869
870bool QPen::doCompareEqualStyle(Qt::PenStyle rhs)
const
872 if (rhs == Qt::NoPen)
873 return style() == Qt::NoPen;
874 return *
this == QPen(rhs);
878
879
880
881
883bool QPen::isDetached()
885 return d->ref.loadRelaxed() == 1;
890
891
892#ifndef QT_NO_DATASTREAM
894
895
896
897
898
899
900
901
903QDataStream &operator<<(QDataStream &s,
const QPen &p)
905 if (s.version() < 3) {
906 s << (quint8)p.style();
907 }
else if (s.version() < QDataStream::Qt_4_3) {
908 s << (quint8)(uint(p.style()) | uint(p.capStyle()) | uint(p.joinStyle()));
910 s << (quint16)(uint(p.style()) | uint(p.capStyle()) | uint(p.joinStyle()));
911 s << (
bool)(p.d->cosmetic);
914 if (s.version() < 7) {
915 s << (quint8)p.width();
918 s <<
double(p.widthF());
920 s <<
double(p.miterLimit());
921 if (
sizeof(qreal) ==
sizeof(
double)) {
922 s << p.dashPattern();
927 QList<qreal> pattern = p.dashPattern();
928 s << quint32(pattern.size());
929 for (
int i = 0; i < pattern.size(); ++i)
930 s <<
double(pattern.at(i));
932 if (s.version() >= 9)
933 s <<
double(p.dashOffset());
934 if (s.version() >= QDataStream::Qt_5_0)
935 s <<
bool(qFuzzyIsNull(p.widthF()));
941
942
943
944
945
946
947
948
957 double miterLimit = 2;
958 QList<qreal> dashPattern;
959 double dashOffset = 0;
960 bool cosmetic =
false;
962 if (s.version() < QDataStream::Qt_4_3) {
970 if (s.version() < 7) {
979 if (
sizeof(qreal) ==
sizeof(
double)) {
985 dashPattern.reserve(numDashes);
986 for (quint32 i = 0; i < numDashes; ++i) {
991 if (s.version() >= 9)
995 if (s.version() >= QDataStream::Qt_5_0) {
1002 p.d->style = Qt::PenStyle(style & Qt::MPenStyle);
1003 p.d->capStyle = Qt::PenCapStyle(style & Qt::MPenCapStyle);
1004 p.d->joinStyle = Qt::PenJoinStyle(style & Qt::MPenJoinStyle);
1005 p.d->dashPattern = dashPattern;
1006 p.d->miterLimit = miterLimit;
1007 p.d->dashOffset = dashOffset;
1008 p.d->cosmetic = cosmetic;
1014#ifndef QT_NO_DEBUG_STREAM
1017 QDebugStateSaver saver(dbg);
1018 dbg.nospace() <<
"QPen(" << p.width() <<
',' << p.brush()
1019 <<
',' << p.style() <<
',' << p.capStyle()
1020 <<
',' << p.joinStyle() <<
',' << p.dashPattern()
1021 <<
',' << p.dashOffset()
1022 <<
',' << p.miterLimit() <<
')';
1028
1029
1030
1033
1034
1035
1036
1040#undef QT_COMPILING_QPEN
QPenDataHolder(const QBrush &brush, qreal width, Qt::PenStyle penStyle, Qt::PenCapStyle penCapStyle, Qt::PenJoinStyle _joinStyle)
~QPenDataHolder()=default
Combined button and popup list for selecting options.
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)