利用QPainter绘制各种图形

这篇博客介绍了如何利用Qt的QPainter类进行二维图形的绘制,包括各种几何形状、像素映射、图像和文字。QPainter支持反走样、像素混合、渐变填充等高级特性,并能进行线性变换。文章通过一步步指导,展示如何创建和使用QPainter来绘制不同类型的图形。
摘要由CSDN通过智能技术生成

    Qt的二维图形引擎是基于QPainter类的。QPainter既可以绘制几何形状(点、线、矩形、椭圆、弧形、弦形、饼状图、多边形和贝塞尔曲线),也可以绘制像素映射、图像和文字。此外,QPainter还支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等。QPainter也支持线性变换,例如平移、旋转、错切和缩放。

    本例子中利用QPainter类提供的各种draw函数,绘制各种类型的图形,包括对图形的形状、颜色、填充风格等的选择。

1.创建paintarea.h

#ifndef PAINTAREA_H
#define PAINTAREA_H

#include <QtGui>

class PaintArea : public QWidget
{
    Q_OBJECT

public:
    enum Shape {Line,Rectangle,RoundRect,Ellipse,Polygon,Polyline,Points,Arc,Path,Text,Pixmap};
    PaintArea(QWidget *parent = 0);

    void setShape(Shape);
    void setPen(QPen);
    void setBrush(QBrush);

    void paintEvent(QPaintEvent *);

private:
    Shape shape;
    QBrush brush;
    QPen pen;
};
#endif // PAINTAREA_H

2.创建paintarea.cpp文件

#include "paintarea.h"

PaintArea::PaintArea(QWidget *parent) : QWidget(parent)
{
    shape = Line;
    QPalette p = palette();
    p.setColor(QPalette::Window,Qt::white);
    setPalette(p);
    setAutoFillBackground(true);

    setMinimumSize(400,400);
}

void PaintArea::setShape(Shape s)
{
    shape = s;
    update();
}

void PaintArea::setPen(QPen p)
{
    pen = p;
    update();
}

void PaintArea::setBrush(QBrush b)
{
    brush = b;
    update();
}

void PaintArea::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setPen(pen);
    p.setBrush(brush);

    QRect rect(50,100,300,200);

    static const QPoint points[4] = {
        QPoint(150,100),
        QPoint(300,150),
        QPoint(350,250),
        QPoint(100,300)
    };

    int startAngle = 30 * 16;
    int spanAngle = 120 * 16;

    QPainterPath path;
    path.addRect(150,150,100,100);
    path.moveTo(100,100);
    path.cubicTo(300,100,200,200,300,300);
    path.cubicTo(100,300,200,200,100,100);

    switch(shape)
    {
        case Line:
            p.drawLine(rect.topLeft(),rect.bottomRight());
            break;
        case Rectangle:
            p.drawRect(rect);
            break;
        case RoundRect:
            p.drawRoundRect(rect);
            break;
        case Ellipse:
            p.drawEllipse(rect);
            break;
        case Polygon:
            p.drawPolygon(points,4);
            break;
        case Polyline:
            p.drawPolyline(points,4);
            break;
        case Points:
            p.drawPoints(points,4);
            break;
        case Arc:
            p.drawArc(rect,startAngle,spanAngle);
            break;
        case Path:
            p.drawPath(path);
            break;
        case Text:
            p.drawText(rect,Qt::AlignCenter,tr("Hello Qt"));
            break;
        case Pixmap:
            p.drawPixmap(150,150,QPixmap(":/images/butterfly.png"));
            break;
        default:
            break;
    }
}

3.创建mainwidget.h


                
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值