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,需要多久创建一次对象。如果导致开销,可以考虑将其做为成员变量,并重用它。
重绘Widget的两种方法,在重写的QWidget::paintEvent()事件函数中,调用上述两种方法之一。
将重绘事件加入到列表,不一定马上就会重绘。在同一时刻多次调用update(), Qt会将它们合并成一个update()。 这样的好处是不会产生闪烁。
立即重绘,不建议经常调用。
上述两个方法,可以通过指定参数来说明要绘制的区域
了解这两个函数之前,先了解下painter的状态:
QPainter 的状态有画笔,画刷,字体,变换(旋转,移动,切变,缩放)等
在绘制之前,设置了painter的状态为State_A, 绘制某个内容,需要调整为State_B, 绘制完成后,painter的状态回到State_A。
QPainter painter(this);
... //设置painter的状态A
painter.save();
...// 设置painter的状态B, 如画笔,画刷,变换等
...// 绘制内容
painter.restore(); //回复painter到状态A
在 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)