Qt 之 Painter

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 轴正方向上
    角度的正方向为逆时针方向
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值