📄 qlcdnumber.cpp
字号:
q->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));}/*! Destroys the LCD number.*/QLCDNumber::~QLCDNumber(){}/*! \property QLCDNumber::numDigits \brief the current number of digits displayed Corresponds to the current number of digits. If \l QLCDNumber::smallDecimalPoint is false, the decimal point occupies one digit position. \sa smallDecimalPoint*/void QLCDNumber::setNumDigits(int numDigits){ Q_D(QLCDNumber); if (numDigits > 99) { qWarning("QLCDNumber::setNumDigits: (%s) Max 99 digits allowed", objectName().toLocal8Bit().constData()); numDigits = 99; } if (numDigits < 0) { qWarning("QLCDNumber::setNumDigits: (%s) Min 0 digits allowed", objectName().toLocal8Bit().constData()); numDigits = 0; } if (d->digitStr.isNull()) { // from constructor d->ndigits = numDigits; d->digitStr.fill(QLatin1Char(' '), d->ndigits); d->points.fill(0, d->ndigits); d->digitStr[d->ndigits - 1] = QLatin1Char('0'); // "0" is the default number } else { bool doDisplay = d->ndigits == 0; if (numDigits == d->ndigits) // no change return; register int i; int dif; if (numDigits > d->ndigits) { // expand dif = numDigits - d->ndigits; QString buf; buf.fill(QLatin1Char(' '), dif); d->digitStr.insert(0, buf); d->points.resize(numDigits); for (i=numDigits-1; i>=dif; i--) d->points.setBit(i, d->points.testBit(i-dif)); for (i=0; i<dif; i++) d->points.clearBit(i); } else { // shrink dif = d->ndigits - numDigits; d->digitStr = d->digitStr.right(numDigits); QBitArray tmpPoints = d->points; d->points.resize(numDigits); for (i=0; i<(int)numDigits; i++) d->points.setBit(i, tmpPoints.testBit(i+dif)); } d->ndigits = numDigits; if (doDisplay) display(value()); update(); }}int QLCDNumber::numDigits() const{ Q_D(const QLCDNumber); return d->ndigits;}/*! \overload Returns true if \a num is too big to be displayed in its entirety; otherwise returns false. \sa display(), numDigits(), smallDecimalPoint()*/bool QLCDNumber::checkOverflow(int num) const{ Q_D(const QLCDNumber); bool of; int2string(num, d->base, d->ndigits, &of); return of;}/*! Returns true if \a num is too big to be displayed in its entirety; otherwise returns false. \sa display(), numDigits(), smallDecimalPoint()*/bool QLCDNumber::checkOverflow(double num) const{ Q_D(const QLCDNumber); bool of; double2string(num, d->base, d->ndigits, &of); return of;}/*! \property QLCDNumber::mode \brief the current display mode (number base) Corresponds to the current display mode, which is one of \c Bin, \c Oct, \c Dec (the default) and \c Hex. \c Dec mode can display floating point values, the other modes display the integer equivalent. \sa smallDecimalPoint(), setHexMode(), setDecMode(), setOctMode(), setBinMode()*/QLCDNumber::Mode QLCDNumber::mode() const{ Q_D(const QLCDNumber); return (QLCDNumber::Mode) d->base;}void QLCDNumber::setMode(Mode m){ Q_D(QLCDNumber); d->base = m; display(d->val);}/*! \property QLCDNumber::value \brief the displayed value This property corresponds to the current value displayed by the LCDNumber. If the displayed value is not a number, the property has a value of 0.*/double QLCDNumber::value() const{ Q_D(const QLCDNumber); return d->val;}/*! \overload Displays the number \a num.*/void QLCDNumber::display(double num){ Q_D(QLCDNumber); d->val = num; bool of; QString s = double2string(d->val, d->base, d->ndigits, &of); if (of) emit overflow(); else d->internalSetString(s);}/*! \property QLCDNumber::intValue \brief the displayed value rounded to the nearest integer This property corresponds to the nearest integer to the current value displayed by the LCDNumber. This is the value used for hexadecimal, octal and binary modes. If the displayed value is not a number, the property has a value of 0.*/int QLCDNumber::intValue() const{ Q_D(const QLCDNumber); return qRound(d->val);}/*! \overload Displays the number \a num.*/void QLCDNumber::display(int num){ Q_D(QLCDNumber); d->val = (double)num; bool of; QString s = int2string(num, d->base, d->ndigits, &of); if (of) emit overflow(); else d->internalSetString(s);}/*! Displays the number represented by the string \a s. This version of the function disregards mode() and smallDecimalPoint(). These digits and other symbols can be shown: 0/O, 1, 2, 3, 4, 5/S, 6, 7, 8, 9/g, minus, decimal point, A, B, C, D, E, F, h, H, L, o, P, r, u, U, Y, colon, degree sign (which is specified as single quote in the string) and space. QLCDNumber substitutes spaces for illegal characters.*/void QLCDNumber::display(const QString &s){ Q_D(QLCDNumber); d->val = 0; bool ok = false; double v = s.toDouble(&ok); if (ok) d->val = v; d->internalSetString(s);}/*! Calls setMode(Hex). Provided for convenience (e.g. for connecting buttons to it). \sa setMode(), setDecMode(), setOctMode(), setBinMode(), mode()*/void QLCDNumber::setHexMode(){ setMode(Hex);}/*! Calls setMode(Dec). Provided for convenience (e.g. for connecting buttons to it). \sa setMode(), setHexMode(), setOctMode(), setBinMode(), mode()*/void QLCDNumber::setDecMode(){ setMode(Dec);}/*! Calls setMode(Oct). Provided for convenience (e.g. for connecting buttons to it). \sa setMode(), setHexMode(), setDecMode(), setBinMode(), mode()*/void QLCDNumber::setOctMode(){ setMode(Oct);}/*! Calls setMode(Bin). Provided for convenience (e.g. for connecting buttons to it). \sa setMode(), setHexMode(), setDecMode(), setOctMode(), mode()*/void QLCDNumber::setBinMode(){ setMode(Bin);}/*! \property QLCDNumber::smallDecimalPoint \brief the style of the decimal point If true the decimal point is drawn between two digit positions. Otherwise it occupies a digit position of its own, i.e. is drawn in a digit position. The default is false. The inter-digit space is made slightly wider when the decimal point is drawn between the digits. \sa mode*/void QLCDNumber::setSmallDecimalPoint(bool b){ Q_D(QLCDNumber); d->smallPoint = b; update();}bool QLCDNumber::smallDecimalPoint() const{ Q_D(const QLCDNumber); return d->smallPoint;}/*!\reimp*/void QLCDNumber::paintEvent(QPaintEvent *){ Q_D(QLCDNumber); QPainter p(this); drawFrame(&p); if (d->smallPoint) d->drawString(d->digitStr, p, &d->points, false); else d->drawString(d->digitStr, p, 0, false);}void QLCDNumberPrivate::internalSetString(const QString& s){ Q_Q(QLCDNumber); QString buffer; int i; int len = s.length(); QBitArray newPoints(ndigits); if (!smallPoint) { if (len == ndigits) buffer = s; else buffer = s.right(ndigits).rightJustified(ndigits, QLatin1Char(' ')); } else { int index = -1; bool lastWasPoint = true; newPoints.clearBit(0); for (i=0; i<len; i++) { if (s[i] == QLatin1Char('.')) { if (lastWasPoint) { // point already set for digit? if (index == ndigits - 1) // no more digits break; index++; buffer[index] = QLatin1Char(' '); // 2 points in a row, add space } newPoints.setBit(index); // set decimal point lastWasPoint = true; } else { if (index == ndigits - 1) break; index++; buffer[index] = s[i]; newPoints.clearBit(index); // decimal point default off lastWasPoint = false; } } if (index < ((int) ndigits) - 1) { for(i=index; i>=0; i--) { buffer[ndigits - 1 - index + i] = buffer[i]; newPoints.setBit(ndigits - 1 - index + i, newPoints.testBit(i)); } for(i=0; i<ndigits-index-1; i++) { buffer[i] = QLatin1Char(' '); newPoints.clearBit(i); } } } if (buffer == digitStr) return; digitStr = buffer; if (smallPoint) points = newPoints; q->update();}/*! \internal*/void QLCDNumberPrivate::drawString(const QString &s, QPainter &p, QBitArray *newPoints, bool newString){ Q_Q(QLCDNumber); QPoint pos; int digitSpace = smallPoint ? 2 : 1; int xSegLen = q->width()*5/(ndigits*(5 + digitSpace) + digitSpace); int ySegLen = q->height()*5/12; int segLen = ySegLen > xSegLen ? xSegLen : ySegLen; int xAdvance = segLen*(5 + digitSpace)/5; int xOffset = (q->width() - ndigits*xAdvance + segLen/5)/2; int yOffset = (q->height() - segLen*2)/2; for (int i=0; i<ndigits; i++) { pos = QPoint(xOffset + xAdvance*i, yOffset); if (newString) drawDigit(pos, p, segLen, s[i].toLatin1(), digitStr[i].toLatin1()); else drawDigit(pos, p, segLen, s[i].toLatin1()); if (newPoints) { char newPoint = newPoints->testBit(i) ? '.' : ' '; if (newString) { char oldPoint = points.testBit(i) ? '.' : ' '; drawDigit(pos, p, segLen, newPoint, oldPoint); } else { drawDigit(pos, p, segLen, newPoint); } } } if (newString) { digitStr = s;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -