QPainter提供的API在GUI或QImage、QOpenGLPaintDevice、QWidget和QPaintDevice显示图形(线、形状、渐变等)、文本、图像。QPainter为了显示图形,利用基于软件的光栅化(raterizer)显示图形,并可以使用OpenGL和OpenGLES的Back_End系统。基于软件的光栅化通过点扫面显示到屏幕。利用QPainter绘制图形最大的好处之一就是,可以使用QpenGL Back-end。因为显示图形时,可以使用3D硬件加速器,即显卡内置的3DHW加速器,这样可以大大提升图形的绘制速度。2.QPainter基本绘图实例
2.1 主要程序片段:
void Widget::paintEvent(QPaintEvent* event){ Q_UNUSED(event); QPainter painter; painter.begin(this); painter.setPen(Qt::blue); painter.drawLine(10, 10, 100, 40); painter.drawRect(120, 10, 80, 80); QRectF rect(230, 10, 80, 80); painter.drawRoundRect(rect, 20, 20); QPointF p1[3] = { QPointF(10, 110), QPointF(110.0, 110.0), QPointF(110, 190) }; painter.drawPolyline(p1, 3); QPointF p2[3] = { QPointF(120, 110.0), QPointF(220, 110), QPointF(220, 190) }; painter.drawPolygon(p2, 3); painter.setFont(QFont("Arial", 20)); painter.setPen(Qt::black); QRect font_rect(10, 200, 320, 280); painter.drawText(font_rect, Qt::AlignHCenter, " My Shadow is lost..."); painter.end();}2.2 代码解释:
1.paintEvent:在GUI使用QPainter绘制图形时,可以使用重定义函数paintEvent()。串口区域要升级或重新绘制时,调用此函数成员。使用成员函数repaint()和update()后,也会调用该函数。例如,重新绘制处于覆盖状态下的窗口区域时,自动调用成员函数paintEvent().2.begin()和end()函数begin()表示开始绘制,末尾行的成员函数end()表示关闭绘图(paint)设备。函数begin()虽然没有参数,但可以明示图像或者控件。3.drawRoundRect()该函数用于绘制圆角矩形,第二个参数是指X轴斜率,第三个参数是Y轴斜率。程序输出:2.3 Qpen
Qpen类使用QPainter绘图时,绘制线和图形轮廓的颜色、宽度、风格。一般使用规则:定义画笔(初始化颜色)-> 定义画笔宽度 -> painter对象连接画笔(setpen)。setStyle()成员函数:该函数可以指定线的风格。SolidLine 直线样式;DashLine:长虚线样式;DotLine:虚线样式等等。setCapStyle()成员函数:可以指定线的末端为平面(Flat)、方形笔帽(SquareCap)和圆形的圆角笔帽(RoundCap)。SetJointStyle()成员函数:定义了连接样式。2.4 QBrush
用指定的颜色填充QPainter绘制的图形。同样以枚举类型进行填充。2.5 渐变
渐变又可以指斜率,利用向量微积分学,根据增加率的大小小时斜率的向量场。2.6 转换
QTransform类可以在QPainter界面是指扩大缩小、旋转、远近等技巧。void Widget::paintEvent(QPaintEvent *event){ Q_UNUSED(event) QImage image("qtblog.png"); //加载图像 QPainter painter(this); painter.begin(this); painter.setPen(QPen(Qt::blue, 1, Qt::DashLine)); painter.drawRect(0, 0, 100, 100); QTransform transform; transform.translate(50, 50); transform.rotate(70, Qt::YAxis); painter.setTransform(transform); //将定义的矩阵加载进来 painter.drawImage(0, 0, image); painter.end();}效果图:
新闻热点
疑难解答