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()函数提供了在构造画笔后更改样式的方法。

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

QPainter主要功能说明与使用_第1张图片

范例: 

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);   //创建QPainter对象
    painter.setRenderHint(QPainter::Antialiasing);//将Antialiasing属性(也就是反走样)设置为true。经过这句设置,我们就打开了QPainter的反走样功能。
    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主要功能说明与使用_第2张图片QPainter主要功能说明与使用_第3张图片

 QPainter主要功能说明与使用_第4张图片QPainter主要功能说明与使用_第5张图片

坐标变换

分组 函数原型 功能
坐标变换 void translate(qreal dx,qreal dy) 坐标系平移一定偏移量,坐标原点平移到新的位置
void rotate(qreal angle) 坐标系旋转一定角度,角度单位为度
void scale(qreal sx,qreal sy) 坐标系缩放
void shear(qreal sh,qreal sv) 坐标系做扭转
状态保存与恢复 void save() 保存当前坐标状态,就是将当前状态压入栈
void restore() 恢复上一次保存的坐标状态,就是从栈中弹出上次的坐标状态
void resetTransform() 复位所有的坐标变换

范例:

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();
}

运行效果:

QPainter主要功能说明与使用_第6张图片

视口和窗口

  • 定义视口函数: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();
}

运行效果:

QPainter主要功能说明与使用_第7张图片QPainter主要功能说明与使用_第8张图片QPainter主要功能说明与使用_第9张图片

你可能感兴趣的:(QT编程学习,qt)