我正试图在QWidget
窗口中绘制一个简单的二维图形。定义了一个paintEvent
,并且还定义了QPainter
类的画家对象。我的绘图包含需要在不同位置多次绘制的元素,如线条、文本等。为此,我使用函数绘制不同位置的线条。文本也是如此。为了使程序更短,也要模块化。
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
类的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
类的对象。
我读了这篇文章,但说明不清楚。必须在绘图的所有实例中调用begin()
和end()
函数,还是仅在paintEvent
函数中调用一次?
正如您所提到的,您将在类中实现这些函数。
在您的标题中:
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 ...
}