油漆事件外的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 类的画家对象不允许使用类型名。

如果我定义QPainterpainter1对象如下图:

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 纹理上?

如何销毁 QPainter 对象/摆脱 drawText() 内存泄漏?

QPainter 初始化画家并使用它

Qt的paint函数重写,以及QPaint给一条线绘制箭头

QPainter使用整理

利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)