Qt开发:如何使用QPainter进行2D图形的绘制

一、QPainter简介

QPainter 是Qt框架中的一个强大的绘图类,用于在各种设备上进行 2D 图形绘制,例如窗口、图像、打印机等。QPainter 提供了丰富的 API,可以用来绘制形状、文本、图像以及其他图形对象,还支持高级特性,比如反锯齿、透明度、渐变填充等。绘图系统基于QPainter、QPaintDevice和QPaintEngine类,QPainter是用来绘图操作的类,QPaintDevice是一个可以使用QOPainter进行绘图的抽象的二维界面,QPaintEngine给QPainter提供在不同设备上绘图的接口。QPaintEngine类由QPainter和QPaintDevice内部使用,应用程序一般无需和QPaintEngine打交道,除非要创建自己的设备类型。一般的绘图设备包括QWidget、QPixmap、QImage等,这些绘图设备为QPainter提供一个画布。

二、如何使用QPainter绘图

使用QPainter绘图步骤:

  1. 需要继承QWidget,然后重写painEvent方法。
  2. 在重写的paintEvent方法中创建一个QPainter对象。
  3. 设置我们绘图中需要的参数,例如笔(QPen)、画刷(QBrush)、字体(QFont)等。
  4. 最后调用对应的方法去绘制我们想要的图像,如直接、三角形、矩形、圆形等。

那么我们为什么一定要在重写的painEvent方法中去绘制图形呢,而不是在其他地方绘制?

  1. 界面更新机制:当窗口被最小化、放大、还原或被其他窗口覆盖时,窗口内容可能会丢失,因此需要重绘。Qt 会自动触发 paintEvent 来重新绘制窗口内容,而不会漏掉任何刷新请求。这种机制避免了手动管理重绘的繁琐,同时保证绘图操作的统一性。
  2. 确保绘图的正确顺序:paintEvent 确保所有绘图内容按照先后顺序绘制。特别是当窗口部件有多个层次的绘制需求时,paintEvent 的绘制过程由 Qt 的绘制系统管理,从而避免了绘制冲突和不一致的问题。
  3. Qt 使用了“脏矩形”(dirty rectangle)更新策略,即仅重绘需要更新的区域。paintEvent 会自动接收到需要更新的区域(通过 QPaintEvent 的 region() 获取),这样可以提高效率,避免不必要的重绘和资源浪费。

三、QPainter的绘图区域

在这里插入图片描述
QWidget的绘制区域就是其窗口的内部区域,如上图所示,是在一个QWidget窗口上绘制了一个填充矩形。在整个窗口内部的矩形区就是QPainter可绘图的区域。QWidget的内部绘图区的坐标系统如上图所示,坐标系统的单位是像素,左上角坐标为(0, 0),向右是X轴正方向,向下是Y轴正方向,绘图区的宽度由QWidget::width()函数获取,高度由QWidget::height()函数获取,所以绘图区右下角的点坐标为(width(), height())。我们使用QPainter在绘图设备上绘图,主要绘制的是一些基本的图形元素,包括点、直线、圆形、矩形、曲线、文字等,控制这些绘图元素特性的主要是QPainter的三个属性。

  1. QPen:它主要用于控制线条的颜色、宽度、线型等。
  2. QBrush:用于设置一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性等,还可以采用图片做材质填充。
  3. QFont:用于绘制文字时,设置文字的字体样式、大小属性等。

当然除了上述的三个基本的绘图属性,还有一些其他的功能结合,比如叠加模式、旋转和缩放等功能。

以下示例代码展示了如何使用 QPainter 绘制矩形:

void MainWindow::paintEvent(QPaintEvent *event)
{
   
    QPainter painter(this); //创建与绘图设备关联的QPainter对象
    painter.setRenderHint(QPainter::Antialiasing); //启用反走样,使得绘图边缘更平滑,减少锯齿状边缘
    painter.setRenderHint(QPainter::TextAntialiasing); //启用文本反走样,改善文本渲染的质量
    QRect rect(this->width() / 4, this->height() / 4, this->width() / 2, this->height() / 2);

    QPen pen; //设置画笔
    pen.setWidth(3); //线宽
    pen.setColor(Qt::red); //划线颜色
    pen.setStyle(Qt::SolidLine); //线端点样式
    pen.setCapStyle(Qt::FlatCap); //线的样式,实践、虚线等
    pen.setJoinStyle(Qt::RoundJoin); //线的连接点样式
    painter.setPen(pen);

    QBrush brush;
    brush.setColor(Qt::yellow); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值