⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qlcdnumber.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -