精通Qt4编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.4 绘图路径——QPainterPath

绘图路径(painter path)由基本图元(矩形、椭圆、直线和曲线等)组成。绘图路径可以是闭合的路径,如矩形和圆;或者是非闭合的路径,如直线和曲线。绘图路径在Qt中使用QPainterPath类表示,它提供了绘图操作的容器,可以使图形能够复用。

绘图路径可以进行填充、显示轮廓和剪裁。要生成可填充的轮廓的绘图路径,可以使用QPainterPathStroker类。使用QPainterPath的优点是复杂图形只需创建一次,就可以多次使用。

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

QPainter可以使用addEllipse()、addPath()、addRect()、addRegion()和addText()将Qt的一些基本图元加入绘图路径。一个已有的绘图路径可以通过connectPath()函数加入到另一个绘图路径中。

如下代码使用QPainterPath绘制了一个箭头。

        QPainterPath path;
        path.moveTo(10,100);
        path.cubicTo(10, 100, 100, 10, 200, 70);
        path.lineTo(200, 50);
        path.lineTo(220, 80);
        path.lineTo(200, 110);
        path.lineTo(200, 90);
        path.cubicTo(200, 100, 100, 50, 50, 100);

        QPainter painter(this);
        QPen pen(QColor(255, 0, 0), 2);
        painter.setPen(pen);
        painter.drawPath(path);

生成的图像如图6-13所示。

图6-13 QPainterPath生成的箭头

Qt提供了两种路径填充方式:Qt::OddEvenFill和Qt::WindingFill。Qt::OddEven是默认的填充规则,它指定QPainterPath使用奇偶填充规则。该规则判断一个点是否在路径图形内的方法是从该点画一条水平线到路径图形外,计算水平线和路径的交点数,如果交点是奇数个则说明该点在路径图形内。

QPainterPath还有一些函数可以获取路径的信息,如elementAt()函数可以取出指定的子路径元素,isEmpty()函数判断当前路径是否为空,controlPointRect()函数返回路径中所有的点和控制点的矩形,该函数运行速度比返回精确包容框的boundingRect()函数快得多。contains()函数判断一个点或矩形是否在路径内,intersects()判断指定的矩形与路径是否相交。

QPainterPath可以将矩形图形转换为其他的图形,如使用toFillPolygon(),toFillPolygons()和toSubpathPolygons()函数将路径转换为多边形。

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

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

程序运行效果如图6-14所示。

图6-14 文字组成的绘图路径