油漆事件外的QPainter画家对象
Posted
技术标签:
【中文标题】油漆事件外的QPainter画家对象【英文标题】:QPainter painter object outside paintevent 【发布时间】:2013-08-15 13:41:42 【问题描述】:我正在尝试在QWidget
窗口中绘制一个简单的二维图形。
定义了一个paintEvent
,还定义了一个QPainter
类的painter 对象。
我的绘图包含我需要在不同位置多次绘制的元素,例如线条、文本等。为此,我使用函数来绘制具有不同位置的这些线条。对于文本也是如此。为了使程序更短,也模块化。
paintEvent
函数正在调用用于计算和绘制的函数。
如何将paintEvent
中定义的QPainter
画家对象传递给函数。
例如
void Classname::drawText(QString text, int PosX, int PosY, QPainter painter)
QSize size=this->size();
QFont times("Helvetica [Cronyx]", 10);
QFontMetrics box(times);
int boxWidth = box.width(text);
int boxHeight = box.height();
painter.setFont(times);
painter.setPen(Qt::white);
painter.drawText(PosX,PosY,text);
然后我收到一个错误,其中 vc++ 环境告诉我 QPainter
类的画家对象不允许使用类型名。
如果我定义QPainter
painter1对象如下图:
void Classname::drawText(QString text, int PosX, int PosY, QPainter painter)
QPainter painter1;
QSize size=this->size();
QFont times("Helvetica [Cronyx]", 10);
QFontMetrics box(times);
int boxWidth = box.width(text);
int boxHeight = box.height();
painter.setFont(times);
painter.setPen(Qt::white);
painter.drawText(PosX,PosY,text);
程序编译但没有输出。
这是代码的一部分,我在所有函数中定义QPainter
类的对象。
我看了this thread,但说明不清楚。必须在所有绘图实例中调用begin()
和end()
函数还是只在paintEvent
函数中调用一次?
【问题讨论】:
我自己发现,painter对象可以传递为QPainter&painter。然后就可以了。 您还可以将画家“程序”存储在QPicture
中。然后,您只需在 paintEvent
中重播它。另一种方法是使用QPainterPath
来存储可重用、可缩放的矢量图形。
【参考方案1】:
正如你提到的,你应该在你的类中实现这些功能。
在您的标题中:
class Class
// ...
protected:
virtual void paintEvent( QPaintEvent* aEvent ) override;
private:
void drawText( QPainter* aPainter, const QString& aText, int aPosX, int aPosY );
// void drawLine( ... );
;
在您的来源中:
void Class::paintEvent( QPaintEvent* aEvent )
QPainter painter( this );
// ...
drawText( &painter/*, ... */ );
drawLine( &painter/*, ... */ );
void Class::drawText( QPainter* aPainter, const QString& aText, int aPosX, int aPosY )
// Your drawing ...
【讨论】:
以上是关于油漆事件外的QPainter画家对象的主要内容,如果未能解决你的问题,请参考以下文章
QPaint 到 QGLFramebufferObject 纹理上?