当前位置: 首页 > 工具软件 > Painter > 使用案例 >

Qt 之 Painter

李俭
2023-12-01

QPainter

“用完后记得销毁”

Simple Code

void SimpleExampleWidget::paintEvent(QPaintEvent *)
  {
      QPainter painter(this);
      painter.setPen(Qt::blue);
      painter.setFont(QFont("Arial", 30));
      painter.drawText(rect(), Qt::AlignCenter, "Qt");  //painter会在函数末尾结束时被销毁,因为painter是在堆栈上
  }
  • 注意

在使用后,记得要删除它。原文:“Remember to destroy the QPainter object after drawing”

什么时候销毁

当在堆栈中创建时(即,不是通过new创建),则不需要删除,就像上述Simple Demo一样。

假设动态分配了QPainter对象

	QPainter* painter = new QPainter(this);
    painter->setPen(Qt::blue);
    painter->setFont(QFont("Arial", 30));
    painter->drawText(rect(), Qt::AlignCenter, "Qt");
    // Delete object, since Qt wont do it for you:
    delete painter;   //手动删除

使用智能指针

boost::scoped_ptr painter = new QPainter(this);

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    boost::scoped_ptr<QPainter> painter = new QPainter(this);
    painter->setPen(Qt::blue);
    painter->setFont(QFont("Arial", 30));
    painter->drawText(rect(), Qt::AlignCenter, "Qt");
}

采取哪种方式

如果在本地创建QPainter,需要多久创建一次对象。如果导致开销,可以考虑将其做为成员变量,并重用它。

update( ) 和 render( )区别

重绘Widget的两种方法,在重写的QWidget::paintEvent()事件函数中,调用上述两种方法之一。

update() 方法

将重绘事件加入到列表,不一定马上就会重绘。在同一时刻多次调用update(), Qt会将它们合并成一个update()。 这样的好处是不会产生闪烁。

render()方法

立即重绘,不建议经常调用。

上述两个方法,可以通过指定参数来说明要绘制的区域

save()和restore()函数

了解这两个函数之前,先了解下painter的状态:

QPainter 的状态有画笔,画刷,字体,变换(旋转,移动,切变,缩放)等

在绘制之前,设置了painter的状态为State_A, 绘制某个内容,需要调整为State_B, 绘制完成后,painter的状态回到State_A。

QPainter painter(this);
... //设置painter的状态A
painter.save();
...// 设置painter的状态B, 如画笔,画刷,变换等
...// 绘制内容
painter.restore(); //回复painter到状态A

在Widget中绘制

在 QWidget 及其子类里绘图却没有这么自由,通常都是要在哪个 widget 上绘图,就需要在它的 paintEvent() 函数里绘图,即重写 paintEvent() 函数。如SimpleCode。

画弧,画弦,画饼

void QPainter::drawArc(const QRectF & rectangle, int startAngle, int spanAngle)
void QPainter::drawPie(const QRectF & rectangle, int startAngle, int spanAngle)
void QPainter::drawChord(const QRectF & rectangle, int startAngle, int spanAngle)
  • rectangle: 包围矩形
  • startAngle: 开始的角度,单位是十六分之一度,如果要从 45 度开始画,则 startAngle 为 45 * 16
  • spanAngle: 覆盖的角度,单位是十六分之一度
  • 绘制圆心为包围矩形的正中心,0 度在圆心的 X 轴正方向上
    角度的正方向为逆时针方向
 类似资料: