Qt的二位图形引擎是基于 QPainter 类的。它既可以绘制几何形状,也可以绘制像素映射、图像和文字。自定义窗口部件需要重新实现 QWidget::paintEvent() 。
void Widget:: paintEvent( QPaintEvent * /*paintEvent*/ )
{
draw();
drawBezier();
}
void Widget:: draw()
{
QPainter painter( this );
painter. setPen( QPen ( Qt :: black, 10 , Qt :: DashDotLine, Qt :: RoundCap));
painter. setBrush( QBrush ( Qt :: green, Qt :: SolidPattern));
painter. drawEllipse( 10 , 10 , 400 , 240 );
painter. drawRect( QRect ( 10 , 300 , 400 , 140 ));
}
首先需要创建一个 QPainter ,将需要绘图的设备的指针传递给 QPainter 。
QPainter 有各种 draw…() 可以绘制不同的图形。画笔、画刷、字体是最重要的三种设置。
画笔用来画线和边缘, QPainter ::setPen() 可以对画笔进行设置,包括颜色、宽度、线型、拐点风格等。
画刷用来填充几何形状的图案, QPainter ::setBrush() 可以对画刷进行设置,包括颜色和纹理风格。
绘制文本时需要对字体进行设置, QPainter ::setFont() 对字体进行设置,包括字体族和磅值。
void Widget:: drawBezier()
{
QPainter painter( this );
painter. setRenderHint( QPainter :: Antialiasing, true );
QPainterPath path;
path. moveTo( 10 , 320 );
path. cubicTo( 200 , 80 , 400 , 80 , 480 , 320 );
painter. setPen( QPen ( Qt :: black, 8 ));
painter. setBrush( QBrush ( Qt :: green, Qt :: DiagCrossPattern));
painter. drawPath( path);
}
QPainterPath 可以通过连接基本的图形单元元素来确定任意的矢量形状,包括:直线、椭圆、多边形、弧形、贝赛尔曲线等。
首先使用 QPainter ::moveto() 来确定图形的起点,然后通过 cubicTo() 来确定绘制的线路。前 4 个参数确定了两个控制点,后两个参数是结束点的位置。
修改函数如下:
void Widget:: drawBezier()
{
QPainter painter( this );
painter. setRenderHint( QPainter :: Antialiasing, true );
QPainterPath path;
path. moveTo( 10 , 320 );
path. cubicTo( 200 , 80 , 400 , 80 , 480 , 320 );
painter. setPen( QPen ( Qt :: black, 2 ));
painter. drawPath( path);
painter. setPen( QPen ( Qt :: red, 4 ));
painter. drawPoint( 10 , 320 );
painter. drawPoint( 200 , 80 );
painter. drawPoint( 400 , 80 );
painter. drawPoint( 480 , 320 );
}
可看到几个点和曲线的位置关系。