qlcdnumber.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 1,268 行 · 第 1/3 页

CPP
1,268
字号
        digitStr.truncate(ndigits);        if (newPoints)            points = *newPoints;    }}/*!  \internal*/void QLCDNumberPrivate::drawDigit(const QPoint &pos, QPainter &p, int segLen,                                  char newCh, char oldCh){// Draws and/or erases segments to change display of a single digit// from oldCh to newCh    char updates[18][2];        // can hold 2 times number of segments, only                                // first 9 used if segment table is correct    int  nErases;    int  nUpdates;    const char *segs;    int  i,j;    const char erase      = 0;    const char draw       = 1;    const char leaveAlone = 2;    segs = getSegments(oldCh);    for (nErases=0; segs[nErases] != 99; nErases++) {        updates[nErases][0] = erase;            // get segments to erase to        updates[nErases][1] = segs[nErases];    // remove old char    }    nUpdates = nErases;    segs = getSegments(newCh);    for(i = 0 ; segs[i] != 99 ; i++) {        for (j=0;  j<nErases; j++)            if (segs[i] == updates[j][1]) {   // same segment ?                updates[j][0] = leaveAlone;     // yes, already on screen                break;            }        if (j == nErases) {                   // if not already on screen            updates[nUpdates][0] = draw;            updates[nUpdates][1] = segs[i];            nUpdates++;        }    }    for (i=0; i<nUpdates; i++) {        if (updates[i][0] == draw)            drawSegment(pos, updates[i][1], p, segLen);        if (updates[i][0] == erase)            drawSegment(pos, updates[i][1], p, segLen, true);    }}static void addPoint(QPolygon &a, const QPoint &p){    uint n = a.size();    a.resize(n + 1);    a.setPoint(n, p);}/*!  \internal*/void QLCDNumberPrivate::drawSegment(const QPoint &pos, char segmentNo, QPainter &p,                                    int segLen, bool erase){    Q_Q(QLCDNumber);    QPoint ppt;    QPoint pt = pos;    int width = segLen/5;    const QPalette &pal = q->palette();    QColor lightColor,darkColor,fgColor;    if (erase){        lightColor = pal.color(q->backgroundRole());        darkColor  = lightColor;        fgColor    = lightColor;    } else {        lightColor = pal.light().color();        darkColor  = pal.dark().color();        fgColor    = pal.color(q->foregroundRole());    }#define LINETO(X,Y) addPoint(a, QPoint(pt.x() + (X),pt.y() + (Y)))#define LIGHT#define DARK    if (fill) {        QPolygon a(0);        //The following is an exact copy of the switch below.        //don't make any changes here        switch (segmentNo) {        case 0 :            ppt = pt;            LIGHT;            LINETO(segLen - 1,0);            DARK;            LINETO(segLen - width - 1,width);            LINETO(width,width);            LINETO(0,0);            break;        case 1 :            pt += QPoint(0 , 1);            ppt = pt;            LIGHT;            LINETO(width,width);            DARK;            LINETO(width,segLen - width/2 - 2);            LINETO(0,segLen - 2);            LIGHT;            LINETO(0,0);            break;        case 2 :            pt += QPoint(segLen - 1 , 1);            ppt = pt;            DARK;            LINETO(0,segLen - 2);            LINETO(-width,segLen - width/2 - 2);            LIGHT;            LINETO(-width,width);            LINETO(0,0);            break;        case 3 :            pt += QPoint(0 , segLen);            ppt = pt;            LIGHT;            LINETO(width,-width/2);            LINETO(segLen - width - 1,-width/2);            LINETO(segLen - 1,0);            DARK;            if (width & 1) {            // adjust for integer division error                LINETO(segLen - width - 3,width/2 + 1);                LINETO(width + 2,width/2 + 1);            } else {                LINETO(segLen - width - 1,width/2);                LINETO(width,width/2);            }            LINETO(0,0);            break;        case 4 :            pt += QPoint(0 , segLen + 1);            ppt = pt;            LIGHT;            LINETO(width,width/2);            DARK;            LINETO(width,segLen - width - 2);            LINETO(0,segLen - 2);            LIGHT;            LINETO(0,0);            break;        case 5 :            pt += QPoint(segLen - 1 , segLen + 1);            ppt = pt;            DARK;            LINETO(0,segLen - 2);            LINETO(-width,segLen - width - 2);            LIGHT;            LINETO(-width,width/2);            LINETO(0,0);            break;        case 6 :            pt += QPoint(0 , segLen*2);            ppt = pt;            LIGHT;            LINETO(width,-width);            LINETO(segLen - width - 1,-width);            LINETO(segLen - 1,0);            DARK;            LINETO(0,0);            break;        case 7 :            if (smallPoint)   // if smallpoint place'.' between other digits                pt += QPoint(segLen + width/2 , segLen*2);            else                pt += QPoint(segLen/2 , segLen*2);            ppt = pt;            DARK;            LINETO(width,0);            LINETO(width,-width);            LIGHT;            LINETO(0,-width);            LINETO(0,0);            break;        case 8 :            pt += QPoint(segLen/2 - width/2 + 1 , segLen/2 + width);            ppt = pt;            DARK;            LINETO(width,0);            LINETO(width,-width);            LIGHT;            LINETO(0,-width);            LINETO(0,0);            break;        case 9 :            pt += QPoint(segLen/2 - width/2 + 1 , 3*segLen/2 + width);            ppt = pt;            DARK;            LINETO(width,0);            LINETO(width,-width);            LIGHT;            LINETO(0,-width);            LINETO(0,0);            break;        default :            qWarning("QLCDNumber::drawSegment: (%s) Illegal segment id: %d\n",                     q->objectName().toLocal8Bit().constData(), segmentNo);        }        // End exact copy        p.setPen(fgColor);        p.setBrush(fgColor);        p.drawPolygon(a);        p.setBrush(Qt::NoBrush);        pt = pos;    }#undef LINETO#undef LIGHT#undef DARK#define LINETO(X,Y) p.drawLine(ppt.x(), ppt.y(), pt.x()+(X), pt.y()+(Y)); \                    ppt = QPoint(pt.x()+(X), pt.y()+(Y))#define LIGHT p.setPen(lightColor)#define DARK  p.setPen(darkColor)    if (shadow)        switch (segmentNo) {        case 0 :            ppt = pt;            LIGHT;            LINETO(segLen - 1,0);            DARK;            LINETO(segLen - width - 1,width);            LINETO(width,width);            LINETO(0,0);            break;        case 1 :            pt += QPoint(0,1);            ppt = pt;            LIGHT;            LINETO(width,width);            DARK;            LINETO(width,segLen - width/2 - 2);            LINETO(0,segLen - 2);            LIGHT;            LINETO(0,0);            break;        case 2 :            pt += QPoint(segLen - 1 , 1);            ppt = pt;            DARK;            LINETO(0,segLen - 2);            LINETO(-width,segLen - width/2 - 2);            LIGHT;            LINETO(-width,width);            LINETO(0,0);            break;        case 3 :            pt += QPoint(0 , segLen);            ppt = pt;            LIGHT;            LINETO(width,-width/2);            LINETO(segLen - width - 1,-width/2);            LINETO(segLen - 1,0);            DARK;            if (width & 1) {            // adjust for integer division error                LINETO(segLen - width - 3,width/2 + 1);                LINETO(width + 2,width/2 + 1);            } else {                LINETO(segLen - width - 1,width/2);                LINETO(width,width/2);            }            LINETO(0,0);            break;        case 4 :            pt += QPoint(0 , segLen + 1);            ppt = pt;            LIGHT;            LINETO(width,width/2);            DARK;            LINETO(width,segLen - width - 2);            LINETO(0,segLen - 2);            LIGHT;            LINETO(0,0);            break;        case 5 :            pt += QPoint(segLen - 1 , segLen + 1);            ppt = pt;            DARK;            LINETO(0,segLen - 2);            LINETO(-width,segLen - width - 2);            LIGHT;            LINETO(-width,width/2);            LINETO(0,0);            break;        case 6 :            pt += QPoint(0 , segLen*2);            ppt = pt;            LIGHT;            LINETO(width,-width);            LINETO(segLen - width - 1,-width);            LINETO(segLen - 1,0);            DARK;            LINETO(0,0);            break;        case 7 :            if (smallPoint)   // if smallpoint place'.' between other digits                pt += QPoint(segLen + width/2 , segLen*2);            else                pt += QPoint(segLen/2 , segLen*2);            ppt = pt;            DARK;            LINETO(width,0);            LINETO(width,-width);            LIGHT;            LINETO(0,-width);            LINETO(0,0);            break;        case 8 :            pt += QPoint(segLen/2 - width/2 + 1 , segLen/2 + width);            ppt = pt;            DARK;            LINETO(width,0);            LINETO(width,-width);            LIGHT;            LINETO(0,-width);            LINETO(0,0);            break;        case 9 :            pt += QPoint(segLen/2 - width/2 + 1 , 3*segLen/2 + width);            ppt = pt;            DARK;            LINETO(width,0);            LINETO(width,-width);            LIGHT;            LINETO(0,-width);            LINETO(0,0);            break;        default :            qWarning("QLCDNumber::drawSegment: (%s) Illegal segment id: %d\n",                     q->objectName().toLocal8Bit().constData(), segmentNo);        }#undef LINETO#undef LIGHT#undef DARK}/*!    \property QLCDNumber::segmentStyle    \brief the style of the LCDNumber    \table    \header \i Style \i Result    \row \i \c Outline         \i Produces raised segments filled with the background color            (this is the default).    \row \i \c Filled         \i Produces raised segments filled with the foreground color.    \row \i \c Flat         \i Produces flat segments filled with the foreground color.    \endtable    \c Outline and \c Filled will additionally use    QPalette::light() and QPalette::dark() for shadow effects.*/void QLCDNumber::setSegmentStyle(SegmentStyle s){    Q_D(QLCDNumber);    d->fill = (s == Flat || s == Filled);    d->shadow = (s == Outline || s == Filled);    update();}QLCDNumber::SegmentStyle QLCDNumber::segmentStyle() const{    Q_D(const QLCDNumber);    Q_ASSERT(d->fill || d->shadow);    if (!d->fill && d->shadow)        return Outline;    if (d->fill && d->shadow)        return Filled;    return Flat;}/*!\reimp*/QSize QLCDNumber::sizeHint() const{    return QSize(10 + 9 * (numDigits() + (smallDecimalPoint() ? 0 : 1)), 23);}/*! \reimp */bool QLCDNumber::event(QEvent *e){    return QFrame::event(e);}/*!    \fn void QLCDNumber::setMargin(int margin)    Sets the width of the margin around the contents of the widget to \a margin.        Use QWidget::setContentsMargins() instead.    \sa margin(), QWidget::setContentsMargins()*//*!    \fn int QLCDNumber::margin() const    Returns the with of the the margin around the contents of the widget.        Use QWidget::getContentsMargins() instead.    \sa setMargin(), QWidget::getContentsMargins()*/#endif // QT_NO_LCDNUMBER

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?