📄 qdrawutil.cpp
字号:
QFrame::setFrameStyle() function to display a shaded panel: \code QFrame frame: frame.setFrameStyle(QFrame::WinPanel | QFrame::Raised); \endcode \sa qDrawShadePanel(), qDrawWinButton(), QStyle*/void qDrawWinPanel(QPainter *p, const QRect &r, const QPalette &pal, bool sunken, const QBrush *fill){ qDrawWinPanel(p, r.x(), r.y(), r.width(), r.height(), pal, sunken, fill);}/*! \fn void qDrawPlainRect(QPainter *painter, const QRect &rect, const QColor &lineColor, int lineWidth, const QBrush *fill) \relates QPainter \overload Draws the plain rectangle specified by \a rect using the given \a painter, \a lineColor and \a lineWidth. The rectangle's interior is filled with the \a fill brush unless \a fill is 0. \warning This function does not look at QWidget::style() or QApplication::style(). Use the drawing functions in QStyle to make widgets that follow the current GUI style. Alternatively you can use a QFrame widget and apply the QFrame::setFrameStyle() function to display a plain rectangle: \code QFrame frame: frame.setFrameStyle(QFrame::Box | QFrame::Plain); \endcode \sa qDrawShadeRect(), QStyle*/void qDrawPlainRect(QPainter *p, const QRect &r, const QColor &c, int lineWidth, const QBrush *fill){ qDrawPlainRect(p, r.x(), r.y(), r.width(), r.height(), c, lineWidth, fill);}#ifdef QT3_SUPPORTstatic void qDrawWinArrow(QPainter *p, Qt::ArrowType type, bool down, int x, int y, int w, int h, const QPalette &pal, bool enabled){ QPolygon a; // arrow polygon switch (type) { case Qt::UpArrow: a.setPoints(7, -3,1, 3,1, -2,0, 2,0, -1,-1, 1,-1, 0,-2); break; case Qt::DownArrow: a.setPoints(7, -3,-1, 3,-1, -2,0, 2,0, -1,1, 1,1, 0,2); break; case Qt::LeftArrow: a.setPoints(7, 1,-3, 1,3, 0,-2, 0,2, -1,-1, -1,1, -2,0); break; case Qt::RightArrow: a.setPoints(7, -1,-3, -1,3, 0,-2, 0,2, 1,-1, 1,1, 2,0); break; default: break; } if (a.isEmpty()) return; if (down) { x++; y++; } QPen savePen = p->pen(); // save current pen if (down) p->setBrushOrigin(p->brushOrigin() + QPoint(1,1)); p->fillRect(x, y, w, h, pal.brush(QPalette::Button)); if (down) p->setBrushOrigin(p->brushOrigin() - QPoint(1,1)); if (enabled) { a.translate(x+w/2, y+h/2); p->setPen(pal.foreground().color()); p->drawLine(a.at(0), a.at(1)); p->drawLine(a.at(2), a.at(2)); p->drawPoint(a[6]); } else { a.translate(x+w/2+1, y+h/2+1); p->setPen(pal.light().color()); p->drawLine(a.at(0), a.at(1)); p->drawLine(a.at(2), a.at(2)); p->drawPoint(a[6]); a.translate(-1, -1); p->setPen(pal.mid().color()); p->drawLine(a.at(0), a.at(1)); p->drawLine(a.at(2), a.at(2)); p->drawPoint(a[6]); } p->setPen(savePen); // restore pen}#endif // QT3_SUPPORT#if defined(Q_CC_MSVC)#pragma warning(disable: 4244)#endif#ifdef QT3_SUPPORT#ifndef QT_NO_STYLE_MOTIF// motif arrows look the same whether they are used or not// is this correct?static void qDrawMotifArrow(QPainter *p, Qt::ArrowType type, bool down, int x, int y, int w, int h, const QPalette &pal, bool){ QPolygon bFill; // fill polygon QPolygon bTop; // top shadow. QPolygon bBot; // bottom shadow. QPolygon bLeft; // left shadow. QTransform matrix; // xform matrix bool vertical = type == Qt::UpArrow || type == Qt::DownArrow; bool horizontal = !vertical; int dim = w < h ? w : h; int colspec = 0x0000; // color specification array if (dim < 2) // too small arrow return; if (dim > 3) { if (dim > 6) bFill.resize(dim & 1 ? 3 : 4); bTop.resize((dim/2)*2); bBot.resize(dim & 1 ? dim + 1 : dim); bLeft.resize(dim > 4 ? 4 : 2); bLeft.putPoints(0, 2, 0,0, 0,dim-1); if (dim > 4) bLeft.putPoints(2, 2, 1,2, 1,dim-3); bTop.putPoints(0, 4, 1,0, 1,1, 2,1, 3,1); bBot.putPoints(0, 4, 1,dim-1, 1,dim-2, 2,dim-2, 3,dim-2); for(int i=0; i<dim/2-2 ; i++) { bTop.putPoints(i*2+4, 2, 2+i*2,2+i, 5+i*2, 2+i); bBot.putPoints(i*2+4, 2, 2+i*2,dim-3-i, 5+i*2,dim-3-i); } if (dim & 1) // odd number size: extra line bBot.putPoints(dim-1, 2, dim-3,dim/2, dim-1,dim/2); if (dim > 6) { // dim>6: must fill interior bFill.putPoints(0, 2, 1,dim-3, 1,2); if (dim & 1) // if size is an odd number bFill.setPoint(2, dim - 3, dim / 2); else bFill.putPoints(2, 2, dim-4,dim/2-1, dim-4,dim/2); } } else { if (dim == 3) { // 3x3 arrow pattern bLeft.setPoints(4, 0,0, 0,2, 1,1, 1,1); bTop .setPoints(2, 1,0, 1,0); bBot .setPoints(2, 1,2, 2,1); } else { // 2x2 arrow pattern bLeft.setPoints(2, 0,0, 0,1); bTop .setPoints(2, 1,0, 1,0); bBot .setPoints(2, 1,1, 1,1); } } if (type == Qt::UpArrow || type == Qt::LeftArrow) { matrix.translate(x, y); if (vertical) { matrix.translate(0, h - 1); matrix.rotate(-90); } else { matrix.translate(w - 1, h - 1); matrix.rotate(180); } if (down) colspec = horizontal ? 0x2334 : 0x2343; else colspec = horizontal ? 0x1443 : 0x1434; } else if (type == Qt::DownArrow || type == Qt::RightArrow) { matrix.translate(x, y); if (vertical) { matrix.translate(w-1, 0); matrix.rotate(90); } if (down) colspec = horizontal ? 0x2443 : 0x2434; else colspec = horizontal ? 0x1334 : 0x1343; } const QColor *cols[5]; cols[0] = 0; cols[1] = &pal.button().color(); cols[2] = &pal.mid().color(); cols[3] = &pal.light().color(); cols[4] = &pal.dark().color();#define CMID *cols[(colspec>>12) & 0xf]#define CLEFT *cols[(colspec>>8) & 0xf]#define CTOP *cols[(colspec>>4) & 0xf]#define CBOT *cols[colspec & 0xf] QPen savePen = p->pen(); // save current pen QBrush saveBrush = p->brush(); // save current brush QTransform wxm = p->transform(); QPen pen(Qt::NoPen); const QBrush &brush = pal.brush(QPalette::Button); p->setPen(pen); p->setBrush(brush); p->setTransform(matrix, true); // set transformation matrix p->drawPolygon(bFill); // fill arrow p->setBrush(Qt::NoBrush); // don't fill p->setPen(CLEFT); p->drawLines(bLeft); p->setPen(CTOP); p->drawLines(bTop); p->setPen(CBOT); p->drawLines(bBot); p->setTransform(wxm); p->setBrush(saveBrush); // restore brush p->setPen(savePen); // restore pen#undef CMID#undef CLEFT#undef CTOP#undef CBOT}#endif // QT_NO_STYLE_MOTIFQRect qItemRect(QPainter *p, Qt::GUIStyle gs, int x, int y, int w, int h, int flags, bool enabled, const QPixmap *pixmap, const QString& text, int len){ QRect result; if (pixmap) { if ((flags & Qt::AlignVCenter) == Qt::AlignVCenter) y += h/2 - pixmap->height()/2; else if ((flags & Qt::AlignBottom) == Qt::AlignBottom) y += h - pixmap->height(); if ((flags & Qt::AlignRight) == Qt::AlignRight) x += w - pixmap->width(); else if ((flags & Qt::AlignHCenter) == Qt::AlignHCenter) x += w/2 - pixmap->width()/2; else if ((flags & Qt::AlignLeft) != Qt::AlignLeft && QApplication::isRightToLeft()) x += w - pixmap->width(); result = QRect(x, y, pixmap->width(), pixmap->height()); } else if (!text.isNull() && p) { result = p->boundingRect(QRect(x, y, w, h), flags, text.left(len)); if (gs == Qt::WindowsStyle && !enabled) { result.setWidth(result.width()+1); result.setHeight(result.height()+1); } } else { result = QRect(x, y, w, h); } return result;}void qDrawArrow(QPainter *p, Qt::ArrowType type, Qt::GUIStyle style, bool down, int x, int y, int w, int h, const QPalette &pal, bool enabled){ switch (style) { case Qt::WindowsStyle: qDrawWinArrow(p, type, down, x, y, w, h, pal, enabled); break;#ifndef QT_NO_STYLE_MOTIF case Qt::MotifStyle: qDrawMotifArrow(p, type, down, x, y, w, h, pal, enabled); break;#endif default: qWarning("qDrawArrow: Requested unsupported GUI style"); }}void qDrawItem(QPainter *p, Qt::GUIStyle gs, int x, int y, int w, int h, int flags, const QPalette &pal, bool enabled, const QPixmap *pixmap, const QString& text, int len , const QColor* penColor){ p->setPen(penColor?*penColor:pal.foreground().color()); if (pixmap) { QPixmap pm(*pixmap); bool clip = (flags & Qt::TextDontClip) == 0; if (clip) { if (pm.width() < w && pm.height() < h) clip = false; else p->setClipRect(x, y, w, h); } if ((flags & Qt::AlignVCenter) == Qt::AlignVCenter) y += h/2 - pm.height()/2; else if ((flags & Qt::AlignBottom) == Qt::AlignBottom) y += h - pm.height(); if ((flags & Qt::AlignRight) == Qt::AlignRight) x += w - pm.width(); else if ((flags & Qt::AlignHCenter) == Qt::AlignHCenter) x += w/2 - pm.width()/2; else if (((flags & Qt::AlignLeft) != Qt::AlignLeft) && QApplication::isRightToLeft()) // Qt::AlignAuto && rightToLeft x += w - pm.width(); if (!enabled) { if (pm.hasAlphaChannel()) { // pixmap with a mask pm = pm.mask(); } else if (pm.depth() == 1) { // monochrome pixmap, no mask ;#ifndef QT_NO_IMAGE_HEURISTIC_MASK } else { // color pixmap, no mask QString k; k.sprintf("$qt-drawitem-%llx", pm.cacheKey()); if (!QPixmapCache::find(k, pm)) { pm = pm.createHeuristicMask(); pm.setMask((QBitmap&)pm); QPixmapCache::insert(k, pm); }#endif } if (gs == Qt::WindowsStyle) { p->setPen(pal.light().color()); p->drawPixmap(x+1, y+1, pm); p->setPen(pal.text().color()); } } p->drawPixmap(x, y, pm); if (clip) p->setClipping(false); } else if (!text.isNull()) { if (gs == Qt::WindowsStyle && !enabled) { p->setPen(pal.light().color()); p->drawText(x+1, y+1, w, h, flags, text.left(len)); p->setPen(pal.text().color()); } p->drawText(x, y, w, h, flags, text.left(len)); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -