Qt中跟蹤QPainter::drawRect的實現
阿新 • • 發佈:2019-02-03
void QPainter::drawRects(const QRectF *rects, int rectCount)
{
#ifdef QT_DEBUG_DRAW
if (qt_show_painter_debug_output)
printf("QPainter::drawRects(), count=%d\n", rectCount);
#endif
Q_D(QPainter);
if (!d->engine) {
qWarning("QPainter::drawRects: Painter not active");
return;
}
if (rectCount <= 0)
return;
//(H) QPaintEngineEx *extended;型別
if (d->extended) {
d->extended->drawRects(rects, rectCount);
return;
}
d->updateState(d->state);
// ...............
}
//////////////////////////////////////////////////////
// 跟蹤drawRect
1. painter.drawRect(rcF);[使用者呼叫]
2. QPainter::drawRects[在qpainter.cpp中]
3. 可能有2中情況
<3.1>d->extended->drawRects(rects, rectCount);
(d的型別為QPainterPrivate)
(extended的型別為QPaintEngineEx)
<3.2>d->engine->drawRects(rects, rectCount);[在qpainter.cpp中]
(engine型別為QPaintEngine, 並且根據不同的平臺為不同的型別)
(例:在X11平臺就為QX11PaintEngine[在qpaintengine_x11_p.h中])
(在Windows平臺就為QRasterPaintEngine[在qpainterengine_raster.cpp中])
///////////////////////////////////////////////
// 假設在Linux平臺使用的是X11
4. QX11PaintEngine::drawRects[在qpaintengine_x11.cpp中]
5. XFillRectangles[qpaintengine_x11.cpp]
(直接使用X11函式繪圖)
///////////////////////////////////////////////
// 假設在Windows平臺用的是rasterizer
4.QRasterPaintEngine::drawRects[在qpaintengine_raster.cpp中]
5.QRasterPaintEngine::stroke[在qpaintengine_raster.cpp中]
6.d->rasterizer->rasterizeLine
(d的型別為QRasterPaintEnginePrivate;rasterizer的型別為QRasterizer;)
故上面這句程式碼實際呼叫的函式為
QRasterizer::rasterizeLine[在qrasterizer.cpp中]
最終繪製到一個QImage,並通過BitBlt繪製到Windows的HDC上面。