【Qt】2D基本绘图操作——QPainter执行绘制及绘图设备介绍


Qt实现2D绘图主要基于QPainter、QPaintDevice、QPaintEngine三个类,- —

  • QPainter用来执行绘图操作。
  • QPaintDevice提供绘图设备,是一个二维空间的抽线,可以用QPainter在绘图设备上进行绘制,是所有可以进行绘制的对象的基类,子类主要有:QWidget、QPixmap、QPicture、QImage、QPrinter和QOpenGLPaintDevice等。
  • QPaintEngine提供一些接口用于QPainter和QPaintDevice内部,使QPainter可以在不同的设备上进行绘制,除了创建自定义的绘图设备类型外,一般不需要使用到QPaintEngine。

QPainter绘图

绘图由QPainter完成具体的操作,可以绘制一切想要的图形,比如线条、矩形、圆乃至更复杂的图形,还可以绘制文本和图片。
绘图操作一般是在一个部件中的重绘事件的处理函数paintEvent()中进行绘制。
paintEvent()函数中首先要创建QPainter对象,然后使用该对象进行图形的绘制,最后销毁QPainter对象。

具体实现操作如下:

  1. 重写绘图事件paintEvent()

  2. 在绘图事件中声明画家对象QPainter painter(this);,this表示在当前部件上绘图,如果不指定this,可以使用QPainter::begin(this)和QPainter::end()两个函数,绘制函数在两个函数中间调用,也表示在当前部件上绘制;

  3. 使用QPainter::draw*函数可以绘制线条、矩形、圆、文字等;

  4. 使用QPainter::setPen()可以设置画笔;

  5. 使用QPainter::setBrush()可以设置画刷;还可以使用QGradient类和QBrush类一起实现渐变填充,Qt支持的渐变填充有:

    1. 线性渐变QLinearGradient
    2. 辐射渐变QRadialGradient
    3. 锥形渐变ConicalGradient

    线性渐变参考代码:

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);  // 在当前widget窗口中绘画,指定绘图设备
    
        // 设置渐变填充
        QLinearGradient linearGradient(QPointF(40,190),QPointF(70,190));
        // 设置渐变填充的颜色
        linearGradient.setColorAt(0,Qt::red);
        linearGradient.setColorAt(0.5,Qt::cyan);
        linearGradient.setColorAt(1,Qt::green);
        // 指定渐变区域以外的区域的扩散方式
        linearGradient.setSpread(QGradient::RepeatSpread);
    
        // 设置画刷为渐变类型
        painter.setBrush(linearGradient);
    
        painter.drawRect(QRect(QPoint(20,20),QPoint(200,200)));
    }
    

绘制基本图形示例代码:

void Widget::paintEvent(QPaintEvent *event)
{
    // 实例化画家类
    QPainter painter(this);  // 在当前widget窗口中绘画,指定绘图设备

    QPen pen(QColor(45,150,56));
    pen.setWidth(3);  // 设置画笔宽度
    pen.setStyle(Qt::DotLine);
    painter.setPen(pen);  // 设置画笔颜色

    // 画刷设置填充色,封闭图形会填充
    QBrush brush(Qt::darkGray);
    brush.setStyle(Qt::Dense7Pattern);
    painter.setBrush(brush);

    painter.drawLine(0,0,100,100);  // 划线
    painter.drawEllipse(QPoint(100,100),50,50);
    painter.drawRect(QRect(QPoint(20,20),QPoint(200,200)));

}

QPainter高级绘图方法:

  1. QPainter::setRenderHint()可以设置绘制的图形是抗锯齿能力;

  2. QPainter::translate()移动QPainter对象;

  3. QPainter::save()保存QPainter对象的状态;

  4. QPainter::restore()还原QPainter对象的状态

  5. 发生重绘的条件:

    1. 手动调用绘图事件可以使用**update()**或repaint()进行重绘,repaint()会立即进行重绘操作,参考代码:

      // 点击移动按钮,移动图片
          connect(ui->pushButton,&QPushButton::clicked,this,[=](){
             // 手动调用重绘图形事件,调用update()更新
              update();
          });
      
    2. 被隐藏的部件被重新调用;

    3. 其它一些原因;

QPainter提供了复合模式来完成数字图像的混合,即如何将源图像的像素和目标图像的像素进行合并,通过调用QPainter::setCompositionMode()实现,通过传递的函数参数确定不同的混合类型。

绘图设备

绘图设备是指继承QPainterDevice的子类。Qt提供了这样的类,分别是QPixmapQBitmapQImageQPicture

  • QPixmap为图像在屏幕上的显示做了优化;
  • QBitmapQPixmap的子类,色深限定为1,可以使用QPixmap::isBitmap()确定一个QPixmap对象是不是一个QPixmap
  • QImage为图像的像素级访问做了优化;
  • QPicture可以记录和重现QPainter的各条命令;

还可以使用QImageReader类从文件或其它设备中读取图像,该类提供了一个格式无关的接口,该类依赖于图像底层的支持,类中的一些操作可以节省内存和加快图像的读取;使用QImageWrite类存储图像。

QPixmap

    // Pixmap绘图设备,为平台做显示的优化
    QPixmap pixmap(400,300);
    // 填充背景色
    pixmap.fill(Qt::white);
    QPainter painter(&pixmap);
    painter.setPen(QPen(Qt::green));  // 设置画笔
    painter.drawEllipse(QPoint(100,100),50,50);
    // 保存图片
    pixmap.save("D:\\pix.png");

QImage

    // QImage绘图设备,可以对像素进行访问
    QImage image(600,400,QImage::Format::Format_RGB32);
    image.fill(Qt::white);  // 填充背景色
    QPainter painter(&image);
    painter.setPen(QPen(Qt::blue));  // 设置画笔
    painter.drawEllipse(QPoint(100,100),50,50);

可以在painteEvent()中对像素值进行修改,示例:

void Widget::paintEvent(QPaintEvent *event)
{
    // 使用QImage对像素进行修改
    QImage image;
    image.load(":/images/phone");
    QPainter painter(this);

    // 修改像素值
    for(int i=20;i<100;++i)
    {
        for(int j=20;j<100;++j)
        {
            QRgb value = qRgb(0,0,255);
            image.setPixel(j,i,value);
        }
    }

    painter.drawImage(10,10,image);
}

QPicture

记录和重现绘图指令

    // QPicture绘图设备,可以记录和重设绘图指令
    QPicture pic;
    QPainter painter;

    painter.begin(&pic);  // 开始在pic上绘图
    painter.setPen(QPen(Qt::red));  // 设置画笔
    painter.drawEllipse(QPoint(200,200),100,100);
    painter.end();  // 结束绘图
    pic.save("D:\\pic");  // 记录了上面的绘图指令,后缀可以随意,甚至没有后缀
    
    // 重现绘图指令
    QPicture pic;
    pic.load("D:\\pic");
    QPainter painter(this);
    painter.drawPicture(0,0,pic);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值