QPainter主要功能说明与使用

图形填充QBrush主要功能:

QBrush类定义QPaint绘制的形状的填充图案。

函数原型功能
void setColor(QColor &color)设置画刷颜色,实体填充时即填充颜色
void setStyle(Qt::BrushStyle style)设置画刷填充样式,参数为枚举类型Qt::BrushStyle(下图)
void setTexture(QPixmap &pixmap)设置一个QPixmap类型图片作为画刷的图片
void setTextureImage(QImage &image)设置一个QImage类型图片作为画刷的图片


笔刷有样式、颜色、渐变和纹理。
brush style() 使用Qt::BrushStyle枚举定义填充图案。默认笔刷样式是Qt::NoBrush(取决于构造笔刷的方式)。这种风格告诉画家不要填充形状。填充的标准样式是Qt::SolidPattern。使用适当的构造函数创建画笔时可以设置样式,此外,setStyle()函数提供了在构造画笔后更改样式的方法。

不同枚举类型对应的填充效果图:

范例: 

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);   //创建QPainter对象
    painter.setRenderHint(QPainter::Antialiasing);//打开图片抗锯齿
    painter.setRenderHint(QPainter::TextAntialiasing); //打开文字抗锯齿
    int W=this->width();                      //绘图区宽度
    int H=this->height();                     //绘图区高度
    QRect rect(W/4,H/4,W/2,H/2);              //中间区域举行
    //设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::red);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);       //设置端点样式
    pen.setJoinStyle(Qt::BevelJoin);    //连接样式
    painter.setPen(pen);
    //1.设置画刷
    //    QBrush brush;
    //    brush.setColor(Qt::yellow);
    //    brush.setStyle(Qt::Dense6Pattern);
    //    painter.setBrush(brush);

    //2.设置线性渐变填充
    //    QLinearGradient linerGrad(rect.left(),rect.top(),rect.right(),rect.top());
    //    linerGrad.setColorAt(0,Qt::blue);
    //    linerGrad.setColorAt(0.5,Qt::white);
    //    linerGrad.setColorAt(1,Qt::blue);
    //    painter.setBrush(linerGrad);

    //3.设置辐射渐变填充
    //    QRadialGradient radialGrad(W/2,H/2,qMax(W/3,H/3),W/2,H/2);
    //    radialGrad.setColorAt(0,Qt::white);
    //    radialGrad.setColorAt(1,Qt::blue);
    //    painter.setBrush(radialGrad);

    //4.设置圆锥形渐变填充
    QConicalGradient conicalGrad(W/2,H/2,45);
    conicalGrad.setColorAt(0,Qt::blue);
    conicalGrad.setColorAt(1,Qt::white);
    painter.setBrush(conicalGrad);

    //5. 设置延展填充
    QRadialGradient radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
    radialGrad.setColorAt(0,Qt::white);
    radialGrad.setColorAt(1,Qt::blue);
    radialGrad.setSpread(QGradient::RepeatSpread);
    painter.setBrush(radialGrad);
    painter.drawRect(this->rect());//填充更大区域,会有延展效果

    //绘图
    painter.drawRect(rect);
}

填充效果如下所示: 

 

坐标变换

 QPainter有关坐标变换操作的函数:

分组

函数原型

功能

坐标变换 

void translate(qreal dx,qreal dy)

void rotate(qreal angle)  

void scale(qreal sx,qreal sy)  

void shear(qrael sh,qreal sy

坐标系统一定的偏移量,坐标原点平移到新的点

坐标系统顺时针旋转一个角度

坐标系统缩放

坐标系统做扭转变换

状态保存与恢复

void save() 

void restore()  

void resetTransform()  

保存painter当前的状态,就是将当前状态压入栈

恢复上一次状态,就是从堆栈中弹出上次的状态

复位所有的坐标变换

范例:

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    //生成五角星的五个顶点,假设原点在五角星中心部分
    qreal R=100;   //半径
    const qreal pi=3.14159;
    qreal deg=pi*72/180;
    QPoint points[5]={QPoint(R,0),
                     QPoint(R*qCos(deg),-R*qSin(deg)),
                     QPoint(R*qCos(2*deg),-R*qSin(2*deg)),
                     QPoint(R*qCos(3*deg),-R*qSin(3*deg)),
                     QPoint(R*qCos(4*deg),-R*qSin(4*deg)),
                     };
    //设置字体
    QFont font;
    font.setPointSize(12);
    painter.setFont(font);
    //设置画笔
    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::black);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter.setPen(pen);
    //设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);
    //设计绘制五角星的painterpath,以便重复使用
    QPainterPath starpath;
    starpath.moveTo(points[0]);
    starpath.lineTo(points[2]);
    starpath.lineTo(points[4]);
    starpath.lineTo(points[1]);
    starpath.lineTo(points[3]);
    starpath.closeSubpath();   //闭合路径,最后一个点与第一个点相连
    //为每个点绑定对应的字体
    starpath.addText(points[0],font,"1");   
    starpath.addText(points[1],font,"2");
    starpath.addText(points[2],font,"3");
    starpath.addText(points[3],font,"4");
    starpath.addText(points[4],font,"5");

    //绘图,第一个五角星
    painter.save();//保存坐标状态
    painter.translate(100,120);
    painter.drawPath(starpath);
    painter.drawText(0,0,"S1");
    painter.restore();//恢复坐标状态

    //第二个五角星
    painter.translate(300,120);
    painter.scale(0.8,0.8);//缩放
    painter.rotate(90);//顺时针旋转
    painter.drawPath(starpath);
    painter.drawText(0,0,"S2");

    //第三个五角星
    painter.resetTransform();//全部坐标重置为初始坐标
    painter.translate(500,120);
    painter.rotate(-150);
    painter.drawPath(starpath);
    painter.drawText(0,0,"S3");
    event->accept();
}

运行效果:

视口和窗口

  • 视口: 绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。视口默认情况下等于绘图设备的整个矩形区。
  • 窗口: 对应于视口的矩形区域,只不过是用逻辑坐标定义的坐标系,(本例中)窗口坐标的中心在矩形中心。

 

  • 定义视口函数:setViewport();
  • 定义窗口函数:setWindow();

范例 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setPalette(QPalette(Qt::white));//设置画板底色为白色
    setAutoFillBackground(true);    //自动刷新背景色
    this->resize(300,300);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    int w=this->width();
    int h=this->height();
    int side=qMin(w,h);    //取宽度与高度之间的最小值
    QRect rect((w-side)/2,(h-side)/2,side,side);
    painter.drawRect(rect);
    painter.setViewport(rect);  //设置视口坐标
    painter.setWindow(-100,-100,200,200);//设置窗口坐标系,原点在矩形中间区域
    //设置画笔
    QPen pen;
    pen.setWidth(1);
    pen.setStyle(Qt::SolidLine);
    pen.setColor(Qt::red);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter.setPen(pen);//设置画笔

    //设置线性渐变
    QLinearGradient linearGrad(0,0,100,0);  //从左到右
    linearGrad.setColorAt(0,Qt::yellow);
    linearGrad.setColorAt(1,Qt::green);
    linearGrad.setSpread(QGradient::PadSpread); //展布模式
    painter.setBrush(linearGrad);

    //设置组合模式
    painter.setCompositionMode(QPainter::CompositionMode_Difference);
    //    painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
    //    painter.setCompositionMode(QPainter::CompositionMode_Exclusion);
    for(int i=0;i<36;i++)
    {
        painter.drawEllipse(QPoint(50,0),50,50);
        painter.rotate(10);
    }
    event->accept();
}

运行效果:

图形视图结构

图形/视图(Graphics View)架构是一种基于图形项(Graphics Item)的模型/视图结构,它主要由三个部分组成,即场景、视图和图形项,它们有各自的坐标系,并且可以互相映射。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值