QPainter绘图与QPen、QFont及QBrush详细用法

一.基本绘图属性:

1.基本绘图类:

Qt的绘图功能基于QPainter、QPainterDevice和QPainterEngine三个类。QPainter类在窗口和其他绘制设备上执行低级绘制。它提供高度优化的功能来完成大多数图形用户界面程序所需的工作,包括绘制基本的点、线、圆等基本形状,以及复杂的形状如饼图和弦等。此外,QPainter还能绘制对齐的文本和像素图。

QPaintDevice类表示QPainter的绘图设备,QPainter能在QPaintDevice的子类上进行图形绘制,QpaintDevice子类包含QImage、QOpenGLPaintDevice、QWidget、QPixmap、PixelBuffer、QGLFramebufferObject、QPicture、QPrinter。

2.绘图事件:

void wiget::paintEvent(QPaintEvent *event){}

QPainter只能在paintEvent中进行绘图。paintEvent事件在窗口刷新时触发,如最大化最小化,拖动窗口边缘时也会触发。

3.主要属性:

(1) QPen:控制线条颜色宽度线性。

(2) QBrush:设置一个区域的填充特性。

(3) QFont:用于绘制文字。

(4) QPixmap: 绘制图片,适合小图片。

(5) QImage: 绘制图片,适合大图片。

(6) QBitmap: QPixmap的一个子类,单通道图。

(7) QPicture: 一张画布,可以用于保存、读取Qpainter的绘图。

(8)QPrinter类是一个在打印机上绘制的绘图设备。它允许你将图形输出到打印机,生成打印预览,或者直接生成PDF文件。

4.基本图形绘制函数:

drawPoint()       //画点

drawLine()       //画直线

drawRect()       //画矩形

drawArc()         //画圆弧

drawEllipse()      //画椭圆

drawPie()          //画扇形

drawPolygon()      //画多边形

drawChord()        //画弦

drawRoundedRect()   //画圆角矩形

drawPolyline()       //画折线

drawConvexPolygon()   //画凸多边形

二.重点绘图属性类介绍

1.QFont的一些属性与功能:

  QFont是Qt框架中用于描述字体属性的工具类。

设置属性:

void setFamily(const QString &family);

void setPointSize(int size);

void setWeight(int weight);

void setItalic(bool italic);

void setUnderline(bool underline);

获取属性:

QString family() const;

int pointSize() const;

int weight() const;

bool italic() const;

bool underline() const;

2.QPen的一些属性与功能:

主要函数:

//函数原型                                功能

void setColor(QColor &color)             //设置画笔颜色

void setWidth(int width)                 //设置线条宽度

void setStyle(Qt::PenStyle style)        //设置线条样式,参数为Qt::PenStyle枚举类型

void setCapStyle(Qt::PenCapStyle style)  //设置线条端点样式,参数为Qt::PenCapStyle枚举类型

void setJoinStyle(Qt::PenJoinStyle style)//设置连接样式,参数为Qt::PenJoinStyle枚举类型

属性修改后,需要使用setPen()来应用于绘图。

(1)线条样式:

Qt::NoPen  //没有画笔,设置此属性时,用画笔不会画出任何东西。但是画刷仍然有效,表现出来就是无边界,但有填充。

Qt::SolidLine   //实线

Qt::DashLine    //虚线

Qt::DotLine     //点状线

Qt::DashDotLine   //虚线和点交替

Qt::DashDotDotLine   //虚线和双点交替

Qt::CustomDashLine   //自定义样式

(2)线条端点样式:

Qt::FlatCap      //平顶端点

Qt::SquareCap    //方形端点

Qt::RoundCap     //圆形端点

(3)线条连接样式:

Qt::BevelJoin      //斜切连接

Qt::MiterJoin      //直角连接

Qt::RoundJoin      //圆连接

3.QBrush的一些属性与功能:

主要函数:

//函数原型                                     功能

void setColor(QColor &color)                       //设置画刷颜色

void setStyle(Qt::BrushStyle style)                   //设置画刷样式

void setTexture(QPixmap &pixmap)                   //设置一个QPixmap图片作为画刷的图片

void setTextureImage(QImage &image)                //设置一个QImage类型的图片作为画刷的图片

(1)基本填充和线性填充:

//枚举常量                            描述

Qt::NoBrush                          //不填充

Qt::SolidPattern                    //单一颜色填充

Qt::HorPattern                      //水平线填充

Qt::VerPattern                      //垂直线填充

(2)渐变填充:

Qt::LinearGradientPattern     //线性渐变,需要使用QLinearGradient类对象作为Brush

Qt::RadialGradientPattern     //辐射渐变,需要使用QRadialGradient类对象作为Brush

Qt::ConicalGradientPattern    //圆锥型渐变,需要使用QConicalGradient类对象作为Brush

Qt::TexturePattern          //材质填充,需要指定texture或textureImage图片

  1. QPrinter用法

(1)QPrinter printer;

printer.setOutputFormat(QPrinter::PdfFormat); // 设置输出格式为PDF,也可以其他格式

    printer.setOutputFileName("output.pdf"); // 设置输出文件名

    QPainter painter1(&printer);

    painter1.drawText(100, 100, "Hello, PDF1!");

    painter1.end(); // 结束绘制,内容将被发送到打印机

  1. 注意:

     用QPrinter需要添加QT += printsupport

      当设置QPainter painter1(&printer)后,绘制图形输出到pdf文件,就不会再输出到ui页面上了。

三.代码示例

1.widget.h

在mianwindow.h中引入QPainter及其他常用模块:

#include <QPainter>

#include <QPrinter>

#include <QBitmap>

#include <QPixmap>

#include <QPicture>

声明Qpainter事件:

protected:

    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;  

//Q_DECL_OVERRIDE表示这个函数是对父类虚函数的重载

2.widget.cpp

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

}

Widget::~Widget()

{

    delete ui;

}

void Widget::paintEvent(QPaintEvent *event)

{

    QPainter painter(this);

    //画线

    painter.drawLine(QPoint(0,0),QPoint(100,100));

    //创建画笔

    QPen pen(Qt::green,5,Qt::DotLine,Qt::RoundCap,Qt::RoundJoin);

    painter.setPen(pen);

    QRectF rectangle(70.0,40.0,80.0,60.0);

    int startAngle=30*16;

    int spanAngle=120*16;

    painter.drawArc(rectangle,startAngle,spanAngle);

    pen.setWidth(1);

    pen.setStyle(Qt::SolidLine);

    painter.setPen(pen);

    //绘制一个矩形

    painter.drawRect(160,20,50,40);

    //创建画刷

    QBrush brush(QColor(0,0,255),Qt::Dense4Pattern);

    //使用画刷

    painter.setBrush(brush);

    //绘制画刷

    painter.drawEllipse(220,20,50,50);

    //设置纹理

    brush.setTexture(QPixmap("abc.png"));

    //重新使用画刷

    painter.setBrush(brush);

    //定义四个点

    static const QPointF points[4]={

        QPointF(270.0,80.0),

        QPointF(290.0,10),

        QPointF(350.0,30),

        QPointF(390.0,50)

    };

    painter.drawPolygon(points,4);

    painter.fillRect(QRect(10,100,150,20),QBrush(Qt::darkYellow));

    painter.eraseRect(QRect(50,0,50,120));

    //线性渐变

    QLinearGradient linearGradient(QPointF(40,190),QPointF(70,190));

    //插入颜色

    linearGradient.setColorAt(0,Qt::yellow);

    linearGradient.setColorAt(0.5,Qt::red);

    linearGradient.setColorAt(1.0,Qt::green);

    //指定渐变区域以外的区域的扩散方式

    linearGradient.setSpread(QGradient::RepeatSpread);

    //使用渐变作为画刷

    painter.setBrush(linearGradient);

    painter.drawRect(10,170,90,40);

    //辐射渐变

    QRadialGradient radialGradient(QPointF(200,190),50,QPointF(275,200));

    radialGradient.setColorAt(0,QColor(255,255,100,150));

    radialGradient.setColorAt(1,QColor(0,0,0,50));

    painter.setBrush(radialGradient);

    painter.drawEllipse(QPointF(200,190),50,50);

    //锥形渐变

    QConicalGradient conicalGradient(QPointF(350,190),60);

    conicalGradient.setColorAt(0.2,Qt::cyan);

    conicalGradient.setColorAt(0.9,Qt::black);

    painter.setBrush(conicalGradient);

    painter.drawEllipse(QPointF(350,190),50,50);

    //画笔使用线性渐变来绘制直线和文字

    painter.setPen(QPen(linearGradient,2));

    painter.drawLine(0,280,100,280);

    painter.drawText(150,280,tr("helloQt"));

    //添加文字

     QFont font1;

     font1.setPixelSize(24); //设置字体像素大小为12

     QString text="hello"; //设置显示的文本

     QFontMetrics metrics(font1);   //获取文字宽度对象

     int w=metrics.width(text); //获取显示文本的宽度

     int h=metrics.height(); //获取显示文本的高度

     painter.setFont(font1);

     painter.setPen(Qt::blue);

     painter.drawText(QRect(this->width()/2-w,this->height()/2-h,w,h),text);

    //绘图打印功能

    QPrinter printer;

    printer.setOutputFormat(QPrinter::PdfFormat); // 设置输出格式为PDF,也可以设置为其他格式

    printer.setOutputFileName("output.pdf"); // 设置输出文件名

    QPainter painter1(&printer);

    painter1.drawText(100, 100, "Hello, PDF1!");

    painter1.end(); // 结束绘制,内容将被发送到打印机

}

完整工程代码可在本博客资源中下载:

https://download.csdn.net/download/xieliru/88848340?spm=1001.2014.3001.5501

四.绘制结果

参考文章:https://blog.csdn.net/qq_36780295/article/details/112791230

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI+程序员在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值