qt中利用opengl绘制曲线_Qt项目中,绘制只有两个圆角的矩形及QPainterPath类的应用...

7a2635fb788f656d65ce6cabb1ebfa1e.png

总第39篇

本文主要梳理总结了在Qt项目开发过程中,某些特殊场合绘制只有两个圆角矩形的方法,并在此基础上详细介绍了类QPainterPath的用法。

1.两个圆角矩形的绘制方法

在Qt项目中,绘制只有两个圆角的矩形,可以使用QPainterPath合并addRoundedRectaddRectpath形成目标path,再使用painter填充绘制此path即可。

其具体的实现代码如下:

void ShapeWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    QString text = "欢迎关注 @武三郎 ,一起学习,共同进步!";
    int text_draw_width = painter.fontMetrics().width(text);   //计算文字的宽度
    text_draw_width += 50;

    int x = 50;
    int width = text_draw_width;
    QRect info_rect(x, 20, width, 54);

    QPainterPath path;
    path.setFillRule( Qt::WindingFill );   //设置填充方式
    path.addRoundedRect (info_rect, 10.0, 10.0);
    QRect temp_rect(info_rect.left(), info_rect.top()+info_rect.height()/2, info_rect.width(), info_rect.height()/2);
    path.addRect(temp_rect);
    painter.fillPath(path,  QBrush(QColor(93, 201, 87)));
    //绘制文字
    QTextOption option;
    option.setAlignment(Qt::AlignCenter);
    painter.drawText(info_rect, text, option);
}

程序运行结果如下图所示:

14d04c01a6617af2decfe3afadd3a632.png

2.QPainterPath类的应用

QPainterPath类提供的是一个容器,主要用于绘图操作,可以创建和重用各图形的形状。我们可以构建图形块对象,如矩形、椭圆、直线等,并将其加入到封装的子路径中,也可以作为未封闭的子路径而独立存在。其中,一个封闭的路径同时存在起始点和结束点。

QPainterPath类可以进行填充、显示轮廓和裁剪。 要生成可填充的轮廓绘制路径,可以使用QPainterPathStroker类。 QPainterPath比正常绘制的主要优点在于: 复杂的图形只需创建一次,然后通过调用QPainterPath::drawPath()接口来进行多次绘制。

QPainterPath对象可以构建一个空的路径,用作给定的起点, 或者另一个对象副本。一旦创建,可以使用lineTo()cubicTo()等函数将直线和曲线添加到路径中。直线和曲线从currentPosition()到作为参数传递的点的位置。

QPainterPath也提供了一些便利的函数来添加一个封闭的子路径,如addEllipse()addRect()addText()等。addPolygon()函数添加一个款封闭的子路径。事实上,这些函数都是moveTo()lineTo()cubicTo()操作的集合。

下面是一些使用的例子。

  • 绘制椭圆路径

可以通过QPainter::addEllipse(const QRectF &boundingRectangle)接口在指定的矩形中创建一个椭圆,并将其添加到绘制路径中作为一个封闭的子路径。此椭圆由顺时针曲线组成,开始点和结束点在0度,即3点钟方向。其代码示例如下:

QLinearGradient myGradient;
QPen myPen;
QRectF boundingRectangle;

QPainterPath myPath;
myPath.addEllipse(boundingRectangle);

QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath); 
  • 绘制多边形路径

可以通过QPainterPath::addPolygon(const QPolygonF &polygon)将给定的多边形添加到路径作为子路径。此路径是未封闭的,添加了多边形后的当前位置,是多边形的最后一点,要回到起始点,可以使用函数closeSubpath()画一条路径封闭路径。其示例代码如下:

QLinearGradient myGradient;
QPen myPen;
QPolygonF myPolygon;

QPainterPath myPath;
myPath.addPolygon(myPolygon);

QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath); 

其效果图如下所示:

ba34f15be6e82301287056af6cff08ee.png
  • 给文本绘制路径

可以使用QPainterPath::addText(const QPointF &point, const QFont &font, const QString &text)接口,将给定的文本添加到些路径,作为一组封闭的子路径。定位子路径是文本的基线的左端指定的点。 其示例效果图如下:

4172bf7a33bea793364fa455b3391a37.png
QLinearGradient myGradient;
QPen myPen;
QFont myFont;
QPointF baseline(x, y);

QPainterPath myPath;
myPath.addText(baseline, myFont, tr("Qt"));

QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);
  • 绘制贝塞尔曲线路径

可以使用QPainterPath::cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint)接口添加一个贝塞尔曲线在当前位置和给定端点间,用c1、c2两点控制。曲线被添加后,当前位置被更新为贝母的终点。其示例代码如下:

QLinearGradient myGradient;
QPen myPen;

QPainterPath myPath;
myPath.cubicTo(c1, c2, endPoint);

QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

效果如下所示:

b25ce3c96c95bfd1c8896b9654b51787.png

Qt提供了Painter Paths ExampleVector Deformation Example两个示例,如果你对这个路径的使用还不太熟悉的话,可以在安装库中看一下这两个例子,它们分别介绍了如何通过QPainterPath来构建复杂的形状, 从而让用户可以填充和描边。

本文到此结束!

如果对你有帮助,请随手 点赞点喜欢

=======================================================

欢迎【关注、私信 @武三郎。我们一起交流一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值