总第39篇
本文主要梳理总结了在Qt项目开发过程中,某些特殊场合绘制只有两个圆角矩形的方法,并在此基础上详细介绍了类QPainterPath
的用法。
1.两个圆角矩形的绘制方法
在Qt项目中,绘制只有两个圆角的矩形,可以使用QPainterPath
合并addRoundedRect
和addRect
的path
形成目标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);
}
程序运行结果如下图所示:
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);
其效果图如下所示:
- 给文本绘制路径
可以使用QPainterPath::addText(const QPointF &point, const QFont &font, const QString &text)
接口,将给定的文本添加到些路径,作为一组封闭的子路径。定位子路径是文本的基线的左端指定的点。 其示例效果图如下:
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);
效果如下所示:
Qt提供了Painter Paths Example
和Vector Deformation Example
两个示例,如果你对这个路径的使用还不太熟悉的话,可以在安装库中看一下这两个例子,它们分别介绍了如何通过QPainterPath
来构建复杂的形状, 从而让用户可以填充和描边。
本文到此结束!
如果对你有帮助,请随手 点赞 或 点喜欢!
=======================================================
欢迎【关注、私信 @武三郎】。我们一起交流一起进步。