使用 QPainter 绘图

Posted

技术标签:

【中文标题】使用 QPainter 绘图【英文标题】:Draw with QPainter 【发布时间】:2010-10-26 15:35:12 【问题描述】:

我需要使用QPainter 进行绘图,但是当我尝试不这样做时

void paintEvent( QPaintEvent* )

我发现错误:

QPainter::setPen: Painter 未激活

QPainter::setBrush: Painter 未激活

我可以使用QPainter not in void paintEvent( QPaintEvent* ) 吗?

谢谢。

【问题讨论】:

【参考方案1】:

您正在使用小部件作为QPainter 的绘制设备。在这种情况下,QPainter 通常只能在小部件的绘制事件的上下文中使用。 QPainter documentation 对此有以下说法:

警告:当paintdevice是 小部件,只能使用 QPainter 在paintEvent() 函数内或在 paintEvent() 调用的函数;那 是除非 Qt::WA_PaintOutsidePaintEvent 小部件 属性已设置。在 Mac OS X 和 Windows,你只能在一个 paintEvent() 函数不管 此属性的设置。

通过为QPainter 设置另一个绘画设备,例如QPixmap,可以在绘画事件之外使用QPainter

【讨论】:

我完全错过了这个问题中的“不”这个词:) 感谢您的回复。我可以用什么来从不同的方法中绘制小部件? 你不需要从不同的方法中提取。将任何用于绘图的代码放入paintEvent() 中。从不同的方法中,您可以通过调用 update() 来触发重绘。如果您需要在某些时候绘制不同的东西,请让您的其他方法修改一些在 paintEvent() 中使用的数据或标志,以更改事物的呈现方式。 例如,我的窗口中有 10 个矩形?它们是用 qpainter 绘制的。现在我想点击其中一个矩形,在这个矩形中必须画圆。 听起来图形视图框架可能比在小部件中绘图更适合您的需求。但是对于您的最后一个问题,您可以为每个矩形维护一个布尔列表或数组,当您确定其中一个被单击时,将该矩形的布尔设置为 true。在您的paintEvent() 中,在绘制每个矩形时查看每个布尔值,如果布尔值为真,则包含一个圆圈。

以上是关于使用 QPainter 绘图的主要内容,如果未能解决你的问题,请参考以下文章

Qt中QPainter的使用

如何在Qgraphicsview上使用QPainter绘图

如何使用 QPainter + QPixmap 实现鼠标绘图?

16基本绘图

Qt开发技术:Qt绘图系统QPainter详解

9.3.1 QPainter相关函数介绍