QPainter画家在paintevent之外的对象

时间:2013-08-15 13:41:42

标签: visual-c++ qt5 qpainter

我试图在QWidget窗口中绘制一个简单的二维图形。 定义了paintEvent,并且还定义了QPainter类的painter对象。 我的绘图包含我需要在不同位置绘制多个元素的元素,例如线条,文本等。为此,我使用函数绘制具有不同位置的这些线条。同样的文字。为了使程序更短,也是模块化的。

paintEvent函数调用用于计算和绘制的函数。

如何将QPainter中定义的paintEvent画家对象传递给函数。

例如

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类的painter对象不允许使用typename。

如果我定义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函数中调用一次吗?

1 个答案:

答案 0 :(得分:0)

正如您所提到的,您将在班上实现这些功能。

在标题中:

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 ...
}