小诸葛080

QPainterPath绘图路径

本文引用http://blog.chinaunix.net/uid-24219701-id-4044473.html

绘图路径(painter path)由基本图元(矩形,椭圆,直线,曲线)组成,绘图路径可以是闭合的路径,如矩形和圆,或者是非闭合的路径,如直线和曲线。

绘图路径在Qt中使用QPainterPth类表示,它提供了绘图操作的容器,可以使图形能够复用。绘图路径可以进行填充,显示轮廓和裁剪。要生成可填充的轮廓的绘图路径,可以使用QPainterPathStroker类.

使用QPainterPath的优点是复杂的图形只需创建一次,就可以多次使用。QPainterPath对象可以时只有起点的空路径,或者从其他QPainterPath对象复制,创建了QPainterPath对象后,可以使用lineTo(),cubicTo(),quadTo() 函数将直线和曲线添加到路径中来,直线和曲线从currentPosition()开始绘制。currentPosition()总是返回最后的子路经绘制的终点。使用moveTo()函数可以在不增加路径的情况下移动currentPositon(),它关闭了一个子路经,开始一个新的子路经。closeSubPath()也可以关闭当前路径,并从currentPosition()连接一条直线到绘图路径的起点。

QPainter可以使用addEllipse(),addPath(),addRect(),addRegion(),addText()将Qt的一些基本图元加入绘图路径。一个已有的绘图路径可以通过connectPath()函数加入到另一个绘图路径中。如下代码绘制了一个箭头:

  1.  1 QPainterPath path;
     2 path.moveTo(10,100);
     3 path.cubicTo(10,100,100,10,200,70);
     4 path.lineTo(200,50);
     5 path.lineTo(220,80);
     6 path.lineTo(200,110);
     7 path.lineTo(200,90);
     8 path.cuticTo(200,100,100,50,50,100);
     9 QPainter painter(this);
    10 QPen pen(QColor(255,0,0),2);
    11 painter.setPen(pen);
    12 painter.drawPath(path);

Qt提供了两种填充方式,Qt::OddEventFill和Qt::WindingFill.Qt::OddEvent时默认的填充规则,它指定QPainterPath使用奇偶填充规则,该规则判断一个点是否在论经图形内的方法是从该店画一条水平线到路径外,计算水平线和路径的交点数,如果交点时奇数个则说明该点在路径图形内。QPainterPath还有一些函数可以获取路径信息,如elementAt()函数可以取出指定的子路经元素,
isEmpty() 函数判断当前路径是否为空。controlPointRect()函数返回路径中所有的点和控制点的矩形,该函数运行速度比返回精确包容框 boundingRect()函数快得多。contains()函数判断一个点或一个矩形是否在路径内。intersects()判断指定的矩形与路径是 否相交.QPainterPath可以将矩形图形转换为其他图形,如使用toFillPolygon(), toFillPolygon(),toSubpathPOlygons()函数将路径转化为多边形。

QPainterPath还可以使用文字作为路径,下面的代码演示了文字路径,并使用线性渐变填充。

1 QLinearGradient linearGrad(QPointF(200,0),QPointF(1000,0));
2 linearGrad.setColorAt(0,Qt::black);
3 linearGrad.setColorAt(1,Qt::white);
4 QFont font("隶书",80);
5 font.setBold(true);
6 QPainterPath textPath();
7 textPath.addText(200,300,font,tr("电子工业出版社"));
8 painter.setBrush(linearGrad);
9 painter.drawPath(textPath);

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

posted on 2015-03-30 20:22  小诸葛080  阅读(3305)  评论(0编辑  收藏  举报

导航