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
qlcdnumber.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qlcdnumber.h"
5
6#include "qbitarray.h"
7#include "qpainter.h"
8#include "private/qframe_p.h"
9
11
13{
14 Q_DECLARE_PUBLIC(QLCDNumber)
15public:
16 void init();
17 void internalSetString(const QString& s);
18 void drawString(const QString& s, QPainter &, QBitArray * = nullptr, bool = true);
19 //void drawString(const QString &, QPainter &, QBitArray * = nullptr) const;
20 void drawDigit(const QPoint &, QPainter &, int, char, char = ' ');
21 void drawSegment(const QPoint &, char, QPainter &, int, bool = false);
22
24 double val;
31};
32
112static QString int2string(int num, int base, int ndigits, bool *oflow)
113{
114 QString s;
115 bool negative;
116 if (num < 0) {
117 negative = true;
118 num = -num;
119 } else {
120 negative = false;
121 }
122 switch(base) {
123 case QLCDNumber::Hex:
124 s = QString::asprintf("%*x", ndigits, num);
125 break;
126 case QLCDNumber::Dec:
127 s = QString::asprintf("%*i", ndigits, num);
128 break;
129 case QLCDNumber::Oct:
130 s = QString::asprintf("%*o", ndigits, num);
131 break;
132 case QLCDNumber::Bin:
133 {
134 char buf[42];
135 char *p = &buf[41];
136 uint n = num;
137 int len = 0;
138 *p = '\0';
139 do {
140 *--p = (char)((n&1)+'0');
141 n >>= 1;
142 len++;
143 } while (n != 0);
144 len = ndigits - len;
145 if (len > 0)
146 s += QString(len, u' ');
148 }
149 break;
150 }
151 if (negative) {
152 for (int i=0; i<(int)s.size(); i++) {
153 if (s[i] != u' ') {
154 if (i != 0) {
155 s[i-1] = u'-';
156 } else {
157 s.insert(0, u'-');
158 }
159 break;
160 }
161 }
162 }
163 if (oflow)
164 *oflow = (int)s.size() > ndigits;
165 return s;
166}
167
168
169static QString double2string(double num, int base, int ndigits, bool *oflow)
170{
171 QString s;
172 if (base != QLCDNumber::Dec) {
173 bool of = num >= 2147483648.0 || num < -2147483648.0;
174 if (of) { // oops, integer overflow
175 if (oflow)
176 *oflow = true;
177 return s;
178 }
179 s = int2string((int)num, base, ndigits, nullptr);
180 } else { // decimal base
181 int nd = ndigits;
182 do {
183 s = QString::asprintf("%*.*g", ndigits, nd, num);
184 qsizetype i = s.indexOf(u'e');
185 if (i > 0 && s[i+1]==u'+') {
186 s[i] = u' ';
187 s[i+1] = u'e';
188 }
189 } while (nd-- && (int)s.size() > ndigits);
190 }
191 if (oflow)
192 *oflow = (int)s.size() > ndigits;
193 return s;
194}
195
196
197static const char *getSegments(char ch) // gets list of segments for ch
198{
199 static const char segments[30][8] =
200 { { 0, 1, 2, 4, 5, 6,99, 0}, // 0 0 / O
201 { 2, 5,99, 0, 0, 0, 0, 0}, // 1 1
202 { 0, 2, 3, 4, 6,99, 0, 0}, // 2 2
203 { 0, 2, 3, 5, 6,99, 0, 0}, // 3 3
204 { 1, 2, 3, 5,99, 0, 0, 0}, // 4 4
205 { 0, 1, 3, 5, 6,99, 0, 0}, // 5 5 / S
206 { 0, 1, 3, 4, 5, 6,99, 0}, // 6 6
207 { 0, 2, 5,99, 0, 0, 0, 0}, // 7 7
208 { 0, 1, 2, 3, 4, 5, 6,99}, // 8 8
209 { 0, 1, 2, 3, 5, 6,99, 0}, // 9 9 / g
210 { 3,99, 0, 0, 0, 0, 0, 0}, // 10 -
211 { 7,99, 0, 0, 0, 0, 0, 0}, // 11 .
212 { 0, 1, 2, 3, 4, 5,99, 0}, // 12 A
213 { 1, 3, 4, 5, 6,99, 0, 0}, // 13 B
214 { 0, 1, 4, 6,99, 0, 0, 0}, // 14 C
215 { 2, 3, 4, 5, 6,99, 0, 0}, // 15 D
216 { 0, 1, 3, 4, 6,99, 0, 0}, // 16 E
217 { 0, 1, 3, 4,99, 0, 0, 0}, // 17 F
218 { 1, 3, 4, 5,99, 0, 0, 0}, // 18 h
219 { 1, 2, 3, 4, 5,99, 0, 0}, // 19 H
220 { 1, 4, 6,99, 0, 0, 0, 0}, // 20 L
221 { 3, 4, 5, 6,99, 0, 0, 0}, // 21 o
222 { 0, 1, 2, 3, 4,99, 0, 0}, // 22 P
223 { 3, 4,99, 0, 0, 0, 0, 0}, // 23 r
224 { 4, 5, 6,99, 0, 0, 0, 0}, // 24 u
225 { 1, 2, 4, 5, 6,99, 0, 0}, // 25 U
226 { 1, 2, 3, 5, 6,99, 0, 0}, // 26 Y
227 { 8, 9,99, 0, 0, 0, 0, 0}, // 27 :
228 { 0, 1, 2, 3,99, 0, 0, 0}, // 28 '
229 {99, 0, 0, 0, 0, 0, 0, 0} }; // 29 empty
230
231 if (ch >= '0' && ch <= '9')
232 return segments[ch - '0'];
233 if (ch >= 'A' && ch <= 'F')
234 return segments[ch - 'A' + 12];
235 if (ch >= 'a' && ch <= 'f')
236 return segments[ch - 'a' + 12];
237
238 int n;
239 switch (ch) {
240 case '-':
241 n = 10; break;
242 case 'O':
243 n = 0; break;
244 case 'g':
245 n = 9; break;
246 case '.':
247 n = 11; break;
248 case 'h':
249 n = 18; break;
250 case 'H':
251 n = 19; break;
252 case 'l':
253 case 'L':
254 n = 20; break;
255 case 'o':
256 n = 21; break;
257 case 'p':
258 case 'P':
259 n = 22; break;
260 case 'r':
261 case 'R':
262 n = 23; break;
263 case 's':
264 case 'S':
265 n = 5; break;
266 case 'u':
267 n = 24; break;
268 case 'U':
269 n = 25; break;
270 case 'y':
271 case 'Y':
272 n = 26; break;
273 case ':':
274 n = 27; break;
275 case '\'':
276 n = 28; break;
277 default:
278 n = 29; break;
279 }
280 return segments[n];
281}
282
283
284
296 : QLCDNumber(5, parent)
297{
298}
299
300
313 : QFrame(*new QLCDNumberPrivate, parent)
314{
315 Q_D(QLCDNumber);
316 d->ndigits = numDigits;
317 d->init();
318}
319
321{
322 Q_Q(QLCDNumber);
323
324 q->setFrameStyle(QFrame::Box | QFrame::Raised);
325 val = 0;
327 smallPoint = false;
328 q->setDigitCount(ndigits);
329 q->setSegmentStyle(QLCDNumber::Filled);
331}
332
340
341
361{
362 Q_D(QLCDNumber);
363 if (Q_UNLIKELY(numDigits > 99)) {
364 qWarning("QLCDNumber::setNumDigits: (%s) Max 99 digits allowed",
365 objectName().toLocal8Bit().constData());
366 numDigits = 99;
367 }
368 if (Q_UNLIKELY(numDigits < 0)) {
369 qWarning("QLCDNumber::setNumDigits: (%s) Min 0 digits allowed",
370 objectName().toLocal8Bit().constData());
371 numDigits = 0;
372 }
373 if (d->digitStr.isNull()) { // from constructor
374 d->ndigits = numDigits;
375 d->digitStr.fill(u' ', d->ndigits);
376 d->points.fill(0, d->ndigits);
377 d->digitStr[d->ndigits - 1] = u'0'; // "0" is the default number
378 } else {
379 bool doDisplay = d->ndigits == 0;
380 if (numDigits == d->ndigits) // no change
381 return;
382 int i;
383 int dif;
384 if (numDigits > d->ndigits) { // expand
385 dif = numDigits - d->ndigits;
386 QString buf;
387 buf.fill(u' ', dif);
388 d->digitStr.insert(0, buf);
389 d->points.resize(numDigits);
390 for (i=numDigits-1; i>=dif; i--)
391 d->points.setBit(i, d->points.testBit(i-dif));
392 for (i=0; i<dif; i++)
393 d->points.clearBit(i);
394 } else { // shrink
395 dif = d->ndigits - numDigits;
396 d->digitStr = d->digitStr.right(numDigits);
397 QBitArray tmpPoints = d->points;
398 d->points.resize(numDigits);
399 for (i=0; i<numDigits; i++)
400 d->points.setBit(i, tmpPoints.testBit(i+dif));
401 }
402 d->ndigits = numDigits;
403 if (doDisplay)
404 display(value());
405 update();
406 }
407}
408
413{
414 Q_D(const QLCDNumber);
415 return d->ndigits;
416}
417
428{
429 Q_D(const QLCDNumber);
430 bool of;
431 int2string(num, d->base, d->ndigits, &of);
432 return of;
433}
434
435
444{
445 Q_D(const QLCDNumber);
446 bool of;
447 double2string(num, d->base, d->ndigits, &of);
448 return of;
449}
450
451
465{
466 Q_D(const QLCDNumber);
467 return (QLCDNumber::Mode) d->base;
468}
469
471{
472 Q_D(QLCDNumber);
473 d->base = m;
474 display(d->val);
475}
476
477
491double QLCDNumber::value() const
492{
493 Q_D(const QLCDNumber);
494 return d->val;
495}
496
503{
504 Q_D(QLCDNumber);
505 d->val = num;
506 bool of;
507 QString s = double2string(d->val, d->base, d->ndigits, &of);
508 if (of)
509 emit overflow();
510 else
511 d->internalSetString(s);
512}
513
528{
529 Q_D(const QLCDNumber);
530 return qRound(d->val);
531}
532
533
540{
541 Q_D(QLCDNumber);
542 d->val = (double)num;
543 bool of;
544 QString s = int2string(num, d->base, d->ndigits, &of);
545 if (of)
546 emit overflow();
547 else
548 d->internalSetString(s);
549}
550
551
566{
567 Q_D(QLCDNumber);
568 d->val = 0;
569 bool ok = false;
570 double v = s.toDouble(&ok);
571 if (ok)
572 d->val = v;
573 d->internalSetString(s);
574}
575
584{
585 setMode(Hex);
586}
587
588
597{
598 setMode(Dec);
599}
600
601
610{
611 setMode(Oct);
612}
613
614
623{
624 setMode(Bin);
625}
626
627
643{
644 Q_D(QLCDNumber);
645 d->smallPoint = b;
646 update();
647}
648
650{
651 Q_D(const QLCDNumber);
652 return d->smallPoint;
653}
654
655
656
662{
663 Q_D(QLCDNumber);
664 QPainter p(this);
665 drawFrame(&p);
666 p.setRenderHint(QPainter::Antialiasing);
667 if (d->shadow)
668 p.translate(0.5, 0.5);
669
670 if (d->smallPoint)
671 d->drawString(d->digitStr, p, &d->points, false);
672 else
673 d->drawString(d->digitStr, p, nullptr, false);
674}
675
676
678{
679 Q_Q(QLCDNumber);
681 int i;
682 int len = s.size();
683 QBitArray newPoints(ndigits);
684
685 if (!smallPoint) {
686 if (len == ndigits)
687 buffer = s;
688 else
689 buffer = s.right(ndigits).rightJustified(ndigits, u' ');
690 } else {
691 int index = -1;
692 bool lastWasPoint = true;
693 newPoints.clearBit(0);
694 for (i=0; i<len; i++) {
695 if (s[i] == u'.') {
696 if (lastWasPoint) { // point already set for digit?
697 if (index == ndigits - 1) // no more digits
698 break;
699 index++;
700 buffer[index] = u' '; // 2 points in a row, add space
701 }
702 newPoints.setBit(index); // set decimal point
703 lastWasPoint = true;
704 } else {
705 if (index == ndigits - 1)
706 break;
707 index++;
708 buffer[index] = s[i];
709 newPoints.clearBit(index); // decimal point default off
710 lastWasPoint = false;
711 }
712 }
713 if (index < ((int) ndigits) - 1) {
714 for(i=index; i>=0; i--) {
715 buffer[ndigits - 1 - index + i] = buffer[i];
716 newPoints.setBit(ndigits - 1 - index + i,
717 newPoints.testBit(i));
718 }
719 for(i=0; i<ndigits-index-1; i++) {
720 buffer[i] = u' ';
721 newPoints.clearBit(i);
722 }
723 }
724 }
725
726 if (buffer == digitStr)
727 return;
728
730 if (smallPoint)
731 points = newPoints;
732 q->update();
733}
734
740 QBitArray *newPoints, bool newString)
741{
742 Q_Q(QLCDNumber);
743 QPoint pos;
744
745 int digitSpace = smallPoint ? 2 : 1;
746 int xSegLen = q->width()*5/(ndigits*(5 + digitSpace) + digitSpace);
747 int ySegLen = q->height()*5/12;
748 int segLen = ySegLen > xSegLen ? xSegLen : ySegLen;
749 int xAdvance = segLen*(5 + digitSpace)/5;
750 int xOffset = (q->width() - ndigits*xAdvance + segLen/5)/2;
751 int yOffset = (q->height() - segLen*2)/2;
752
753 for (int i=0; i<ndigits; i++) {
754 pos = QPoint(xOffset + xAdvance*i, yOffset);
755 if (newString)
756 drawDigit(pos, p, segLen, s[i].toLatin1(), digitStr[i].toLatin1());
757 else
758 drawDigit(pos, p, segLen, s[i].toLatin1());
759 if (newPoints) {
760 char newPoint = newPoints->testBit(i) ? '.' : ' ';
761 if (newString) {
762 char oldPoint = points.testBit(i) ? '.' : ' ';
763 drawDigit(pos, p, segLen, newPoint, oldPoint);
764 } else {
765 drawDigit(pos, p, segLen, newPoint);
766 }
767 }
768 }
769 if (newString) {
770 digitStr = s;
772 if (newPoints)
773 points = *newPoints;
774 }
775}
776
777
783 char newCh, char oldCh)
784{
785// Draws and/or erases segments to change display of a single digit
786// from oldCh to newCh
787
788 char updates[18][2]; // can hold 2 times number of segments, only
789 // first 9 used if segment table is correct
790 int nErases;
791 int nUpdates;
792 const char *segs;
793 int i,j;
794
795 const char erase = 0;
796 const char draw = 1;
797 const char leaveAlone = 2;
798
799 segs = getSegments(oldCh);
800 for (nErases=0; segs[nErases] != 99; nErases++) {
801 updates[nErases][0] = erase; // get segments to erase to
802 updates[nErases][1] = segs[nErases]; // remove old char
803 }
804 nUpdates = nErases;
805 segs = getSegments(newCh);
806 for(i = 0 ; segs[i] != 99 ; i++) {
807 for (j=0; j<nErases; j++)
808 if (segs[i] == updates[j][1]) { // same segment ?
809 updates[j][0] = leaveAlone; // yes, already on screen
810 break;
811 }
812 if (j == nErases) { // if not already on screen
813 updates[nUpdates][0] = draw;
814 updates[nUpdates][1] = segs[i];
815 nUpdates++;
816 }
817 }
818 for (i=0; i<nUpdates; i++) {
819 if (updates[i][0] == draw)
820 drawSegment(pos, updates[i][1], p, segLen);
821 if (updates[i][0] == erase)
822 drawSegment(pos, updates[i][1], p, segLen, true);
823 }
824}
825
826
827static void addPoint(QPolygon &a, const QPoint &p)
828{
829 uint n = a.size();
830 a.resize(n + 1);
831 a.setPoint(n, p);
832}
833
838void QLCDNumberPrivate::drawSegment(const QPoint &pos, char segmentNo, QPainter &p,
839 int segLen, bool erase)
840{
841 Q_Q(QLCDNumber);
842 QPoint ppt;
843 QPoint pt = pos;
844 int width = segLen/5;
845
846 const QPalette &pal = q->palette();
847 QColor lightColor,darkColor,fgColor;
848 if (erase){
849 lightColor = pal.color(q->backgroundRole());
850 darkColor = lightColor;
851 fgColor = lightColor;
852 } else {
853 lightColor = pal.light().color();
854 darkColor = pal.dark().color();
855 fgColor = pal.color(q->foregroundRole());
856 }
857
858
859#define LINETO(X,Y) addPoint(a, QPoint(pt.x() + (X),pt.y() + (Y)))
860#define LIGHT
861#define DARK
862
863 if (fill) {
864 QPolygon a(0);
865 //The following is an exact copy of the switch below.
866 //don't make any changes here
867 switch (segmentNo) {
868 case 0 :
869 ppt = pt;
870 LIGHT;
871 LINETO(segLen - 1,0);
872 DARK;
873 LINETO(segLen - width - 1,width);
875 LINETO(0,0);
876 break;
877 case 1 :
878 pt += QPoint(0 , 1);
879 ppt = pt;
880 LIGHT;
882 DARK;
883 LINETO(width,segLen - width/2 - 2);
884 LINETO(0,segLen - 2);
885 LIGHT;
886 LINETO(0,0);
887 break;
888 case 2 :
889 pt += QPoint(segLen - 1 , 1);
890 ppt = pt;
891 DARK;
892 LINETO(0,segLen - 2);
893 LINETO(-width,segLen - width/2 - 2);
894 LIGHT;
896 LINETO(0,0);
897 break;
898 case 3 :
899 pt += QPoint(0 , segLen);
900 ppt = pt;
901 LIGHT;
902 LINETO(width,-width/2);
903 LINETO(segLen - width - 1,-width/2);
904 LINETO(segLen - 1,0);
905 DARK;
906 if (width & 1) { // adjust for integer division error
907 LINETO(segLen - width - 3,width/2 + 1);
908 LINETO(width + 2,width/2 + 1);
909 } else {
910 LINETO(segLen - width - 1,width/2);
911 LINETO(width,width/2);
912 }
913 LINETO(0,0);
914 break;
915 case 4 :
916 pt += QPoint(0 , segLen + 1);
917 ppt = pt;
918 LIGHT;
919 LINETO(width,width/2);
920 DARK;
921 LINETO(width,segLen - width - 2);
922 LINETO(0,segLen - 2);
923 LIGHT;
924 LINETO(0,0);
925 break;
926 case 5 :
927 pt += QPoint(segLen - 1 , segLen + 1);
928 ppt = pt;
929 DARK;
930 LINETO(0,segLen - 2);
931 LINETO(-width,segLen - width - 2);
932 LIGHT;
933 LINETO(-width,width/2);
934 LINETO(0,0);
935 break;
936 case 6 :
937 pt += QPoint(0 , segLen*2);
938 ppt = pt;
939 LIGHT;
941 LINETO(segLen - width - 1,-width);
942 LINETO(segLen - 1,0);
943 DARK;
944 LINETO(0,0);
945 break;
946 case 7 :
947 if (smallPoint) // if smallpoint place'.' between other digits
948 pt += QPoint(segLen + width/2 , segLen*2);
949 else
950 pt += QPoint(segLen/2 , segLen*2);
951 ppt = pt;
952 DARK;
953 LINETO(width,0);
955 LIGHT;
956 LINETO(0,-width);
957 LINETO(0,0);
958 break;
959 case 8 :
960 pt += QPoint(segLen/2 - width/2 + 1 , segLen/2 + width);
961 ppt = pt;
962 DARK;
963 LINETO(width,0);
965 LIGHT;
966 LINETO(0,-width);
967 LINETO(0,0);
968 break;
969 case 9 :
970 pt += QPoint(segLen/2 - width/2 + 1 , 3*segLen/2 + width);
971 ppt = pt;
972 DARK;
973 LINETO(width,0);
975 LIGHT;
976 LINETO(0,-width);
977 LINETO(0,0);
978 break;
979 default :
980 qWarning("QLCDNumber::drawSegment: (%s) Illegal segment id: %d\n",
981 q->objectName().toLocal8Bit().constData(), segmentNo);
982 }
983 // End exact copy
984 p.setPen(Qt::NoPen);
985 p.setBrush(fgColor);
986 p.drawPolygon(a);
987 p.setBrush(Qt::NoBrush);
988
989 pt = pos;
990 }
991#undef LINETO
992#undef LIGHT
993#undef DARK
994
995#define LINETO(X,Y) p.drawLine(ppt.x(), ppt.y(), pt.x()+(X), pt.y()+(Y)); \
996 ppt = QPoint(pt.x()+(X), pt.y()+(Y))
997#define LIGHT p.setPen(lightColor)
998#define DARK p.setPen(darkColor)
999 if (shadow)
1000 switch (segmentNo) {
1001 case 0 :
1002 ppt = pt;
1003 LIGHT;
1004 LINETO(segLen - 1,0);
1005 DARK;
1006 LINETO(segLen - width - 1,width);
1008 LINETO(0,0);
1009 break;
1010 case 1 :
1011 pt += QPoint(0,1);
1012 ppt = pt;
1013 LIGHT;
1015 DARK;
1016 LINETO(width,segLen - width/2 - 2);
1017 LINETO(0,segLen - 2);
1018 LIGHT;
1019 LINETO(0,0);
1020 break;
1021 case 2 :
1022 pt += QPoint(segLen - 1 , 1);
1023 ppt = pt;
1024 DARK;
1025 LINETO(0,segLen - 2);
1026 LINETO(-width,segLen - width/2 - 2);
1027 LIGHT;
1028 LINETO(-width,width);
1029 LINETO(0,0);
1030 break;
1031 case 3 :
1032 pt += QPoint(0 , segLen);
1033 ppt = pt;
1034 LIGHT;
1035 LINETO(width,-width/2);
1036 LINETO(segLen - width - 1,-width/2);
1037 LINETO(segLen - 1,0);
1038 DARK;
1039 if (width & 1) { // adjust for integer division error
1040 LINETO(segLen - width - 3,width/2 + 1);
1041 LINETO(width + 2,width/2 + 1);
1042 } else {
1043 LINETO(segLen - width - 1,width/2);
1044 LINETO(width,width/2);
1045 }
1046 LINETO(0,0);
1047 break;
1048 case 4 :
1049 pt += QPoint(0 , segLen + 1);
1050 ppt = pt;
1051 LIGHT;
1052 LINETO(width,width/2);
1053 DARK;
1054 LINETO(width,segLen - width - 2);
1055 LINETO(0,segLen - 2);
1056 LIGHT;
1057 LINETO(0,0);
1058 break;
1059 case 5 :
1060 pt += QPoint(segLen - 1 , segLen + 1);
1061 ppt = pt;
1062 DARK;
1063 LINETO(0,segLen - 2);
1064 LINETO(-width,segLen - width - 2);
1065 LIGHT;
1066 LINETO(-width,width/2);
1067 LINETO(0,0);
1068 break;
1069 case 6 :
1070 pt += QPoint(0 , segLen*2);
1071 ppt = pt;
1072 LIGHT;
1073 LINETO(width,-width);
1074 LINETO(segLen - width - 1,-width);
1075 LINETO(segLen - 1,0);
1076 DARK;
1077 LINETO(0,0);
1078 break;
1079 case 7 :
1080 if (smallPoint) // if smallpoint place'.' between other digits
1081 pt += QPoint(segLen + width/2 , segLen*2);
1082 else
1083 pt += QPoint(segLen/2 , segLen*2);
1084 ppt = pt;
1085 DARK;
1086 LINETO(width,0);
1087 LINETO(width,-width);
1088 LIGHT;
1089 LINETO(0,-width);
1090 LINETO(0,0);
1091 break;
1092 case 8 :
1093 pt += QPoint(segLen/2 - width/2 + 1 , segLen/2 + width);
1094 ppt = pt;
1095 DARK;
1096 LINETO(width,0);
1097 LINETO(width,-width);
1098 LIGHT;
1099 LINETO(0,-width);
1100 LINETO(0,0);
1101 break;
1102 case 9 :
1103 pt += QPoint(segLen/2 - width/2 + 1 , 3*segLen/2 + width);
1104 ppt = pt;
1105 DARK;
1106 LINETO(width,0);
1107 LINETO(width,-width);
1108 LIGHT;
1109 LINETO(0,-width);
1110 LINETO(0,0);
1111 break;
1112 default :
1113 qWarning("QLCDNumber::drawSegment: (%s) Illegal segment id: %d\n",
1114 q->objectName().toLocal8Bit().constData(), segmentNo);
1115 }
1116
1117#undef LINETO
1118#undef LIGHT
1119#undef DARK
1120}
1121
1122
1123
1143{
1144 Q_D(QLCDNumber);
1145 d->fill = (s == Flat || s == Filled);
1146 d->shadow = (s == Outline || s == Filled);
1147 update();
1148}
1149
1151{
1152 Q_D(const QLCDNumber);
1153 Q_ASSERT(d->fill || d->shadow);
1154 if (!d->fill && d->shadow)
1155 return Outline;
1156 if (d->fill && d->shadow)
1157 return Filled;
1158 return Flat;
1159}
1160
1161
1165{
1166 return QSize(10 + 9 * (digitCount() + (smallDecimalPoint() ? 0 : 1)), 23);
1167}
1168
1171{
1172 return QFrame::event(e);
1173}
1174
1176
1177#include "moc_qlcdnumber.cpp"
\inmodule QtCore
Definition qbitarray.h:13
void resize(qsizetype size)
Resizes the bit array to size bits.
const QColor & color() const
Returns the brush color.
Definition qbrush.h:121
\inmodule QtCore
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
\inmodule QtCore
Definition qcoreevent.h:45
The QFrame class is the base class of widgets that can have a frame.
Definition qframe.h:17
@ Raised
Definition qframe.h:50
bool event(QEvent *e) override
\reimp
Definition qframe.cpp:511
void drawFrame(QPainter *)
Definition qframe.cpp:488
@ Box
Definition qframe.h:40
void drawString(const QString &s, QPainter &, QBitArray *=nullptr, bool=true)
void drawDigit(const QPoint &, QPainter &, int, char, char=' ')
void internalSetString(const QString &s)
void drawSegment(const QPoint &, char, QPainter &, int, bool=false)
The QLCDNumber widget displays a number with LCD-like digits.
Definition qlcdnumber.h:16
void setBinMode()
Calls setMode(Bin).
double value
the displayed value
Definition qlcdnumber.h:22
Mode
This type determines how numbers are shown.
Definition qlcdnumber.h:30
void setOctMode()
Calls setMode(Oct).
QSize sizeHint() const override
\reimp
SegmentStyle segmentStyle
the style of the LCDNumber.
Definition qlcdnumber.h:21
bool checkOverflow(double num) const
Returns true if num is too big to be displayed in its entirety; otherwise returns false.
void setSmallDecimalPoint(bool)
SegmentStyle
This type determines the visual appearance of the QLCDNumber widget.
Definition qlcdnumber.h:34
void setHexMode()
Calls setMode(Hex).
void setSegmentStyle(SegmentStyle)
void display(const QString &str)
Displays the number represented by the string s.
bool smallDecimalPoint
the style of the decimal point
Definition qlcdnumber.h:18
bool event(QEvent *e) override
\reimp
void setDigitCount(int nDigits)
Sets the current number of digits to numDigits.
void paintEvent(QPaintEvent *) override
\reimp
void overflow()
This signal is emitted whenever the QLCDNumber is asked to display a too-large number or a too-long s...
void setDecMode()
Calls setMode(Dec).
Mode mode
the current display mode (number base)
Definition qlcdnumber.h:20
int digitCount
the current number of digits displayed
Definition qlcdnumber.h:19
void setMode(Mode)
~QLCDNumber()
Destroys the LCD number.
int intValue
the displayed value rounded to the nearest integer
Definition qlcdnumber.h:23
QLCDNumber(QWidget *parent=nullptr)
Constructs an LCD number, sets the number of digits to 5, the base to decimal, the decimal point mode...
QString objectName
the name of this object
Definition qobject.h:107
The QPaintEvent class contains event parameters for paint events.
Definition qevent.h:486
The QPainter class performs low-level painting on widgets and other paint devices.
Definition qpainter.h:46
@ Antialiasing
Definition qpainter.h:52
The QPalette class contains color groups for each widget state.
Definition qpalette.h:19
const QBrush & dark() const
Returns the dark brush of the current color group.
Definition qpalette.h:86
const QBrush & light() const
Returns the light brush of the current color group.
Definition qpalette.h:85
const QColor & color(ColorGroup cg, ColorRole cr) const
Returns the color in the specified color group, used for the given color role.
Definition qpalette.h:67
\inmodule QtCore\reentrant
Definition qpoint.h:25
The QPolygon class provides a list of points using integer precision.
Definition qpolygon.h:23
The QSizePolicy class is a layout attribute describing horizontal and vertical resizing policy.
Definition qsizepolicy.h:18
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
void truncate(qsizetype pos)
Truncates the string at the given position index.
Definition qstring.cpp:6319
static QString static QString asprintf(const char *format,...) Q_ATTRIBUTE_FORMAT_PRINTF(1
Definition qstring.cpp:7263
The QWidget class is the base class of all user interface objects.
Definition qwidget.h:99
void update()
Updates the widget unless updates are disabled or the widget is hidden.
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
@ NoPen
@ NoBrush
qsizetype erase(QByteArray &ba, const T &t)
Definition qbytearray.h:782
#define Q_UNLIKELY(x)
int qRound(qfloat16 d) noexcept
Definition qfloat16.h:327
static const char * getSegments(char ch)
static void addPoint(QPolygon &a, const QPoint &p)
static QString int2string(int num, int base, int ndigits, bool *oflow)
static QString double2string(double num, int base, int ndigits, bool *oflow)
#define LIGHT
#define LINETO(X, Y)
#define DARK
#define qWarning
Definition qlogging.h:166
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
const GLfloat * m
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint index
[2]
GLenum GLuint buffer
GLint GLsizei width
GLenum GLuint GLenum GLsizei const GLchar * buf
GLfloat n
GLfixed GLfixed GLint GLint GLfixed points
GLdouble s
[6]
Definition qopenglext.h:235
GLuint GLfloat * val
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLuint segments
GLfloat GLfloat p
[1]
GLenum GLsizei len
GLuint num
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static char * toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
#define emit
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
static const uint base
Definition qurlidna.cpp:20
static int numDigits(qlonglong n)
myFilter draw(painter, QPoint(0, 0), originalPixmap)