2

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

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

如果我定义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在所有函数中定义类的对象。

我读了这个线程,但说明不清楚。必须在所有绘图实例中调用begin()and函数还是在函数中只调用一次?end()paintEvent

4

1 回答 1

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 ...
}
于 2015-06-07T19:58:32.497 回答