本文整理汇总了C++中QPainterPath::percentAtLength方法的典型用法代码示例。如果您正苦于以下问题:C++ QPainterPath::percentAtLength方法的具体用法?C++ QPainterPath::percentAtLength怎么用?C++ QPainterPath::percentAtLength使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QPainterPath
的用法示例。
在下文中一共展示了QPainterPath::percentAtLength方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createArrowPoly
//FIXME: width and length for arrow
QPolygonF QNEConnection::createArrowPoly(QPainterPath& p, QNEPort* conn) {
float arrowStartPercentage;
float arrowEndPercentage;
if (conn->isOutput()) {
arrowStartPercentage = p.percentAtLength(p.length() - conn->radius() - arrowSize);
arrowEndPercentage = p.percentAtLength(p.length() - conn->radius());
}
else {
//assuming is start connector, should throw exception otherwise?
arrowStartPercentage = p.percentAtLength(conn->radius() + arrowSize);
arrowEndPercentage = p.percentAtLength(conn->radius());
}
QPointF headStartP = p.pointAtPercent(arrowStartPercentage);
QPointF headEndP = p.pointAtPercent(arrowEndPercentage);
QLineF arrowMiddleLine(headStartP, headEndP);
//QLineF normHead = arrowMiddleLine.normalVector();
arrowMiddleLine.unitVector();
QPointF normHead(arrowMiddleLine.dy(), -arrowMiddleLine.dx());
QPointF arrowP1 = headStartP + normHead * 0.4;
QPointF arrowP2 = headStartP - normHead * 0.4;
QPolygonF arrowHeadEnd;
arrowHeadEnd << headEndP << arrowP1 << arrowP2 << headEndP /*<< headEndP*/;
return arrowHeadEnd;
}
示例2: createArrowPoly
QPolygonF mafNodeConnectionGraphicWidget::createArrowPoly(QPainterPath& p, mafNodeConnectorGraphicWidget* conn) {
float arrowStartPercentage;
float arrowEndPercentage;
if (conn == mEndConnector) {
arrowStartPercentage = p.percentAtLength(p.length() - conn->mRadius - arrowSize);
arrowEndPercentage = p.percentAtLength(p.length() - conn->mRadius);
}
else {
arrowStartPercentage = p.percentAtLength(conn->mRadius + arrowSize);
arrowEndPercentage = p.percentAtLength(conn->mRadius);
}
QPointF headStartP = p.pointAtPercent(arrowStartPercentage);
QPointF headEndP = p.pointAtPercent(arrowEndPercentage);
QLineF arrowMiddleLine(headStartP, headEndP);
//QLineF normHead = arrowMiddleLine.normalVector();
arrowMiddleLine.unitVector();
QPointF normHead(arrowMiddleLine.dy(), -arrowMiddleLine.dx());
QPointF arrowP1 = headStartP + normHead * 0.4;
QPointF arrowP2 = headStartP - normHead * 0.4;
QPolygonF arrowHeadEnd;
arrowHeadEnd << headEndP << arrowP1 << arrowP2 /*<< headEndP*/;
return arrowHeadEnd;
}
示例3: drawLabel
void PrimitivePainter::drawLabel(QPainterPath* R, QPainter* thePainter, qreal PixelPerM, QString str, QString strBg) const
{
if (!DrawLabel)
return;
if (str.isEmpty() && strBg.isEmpty())
return;
thePainter->save();
if (getLabelArea()) {
QPointF C(R->boundingRect().center());
drawPointLabel(C, str, strBg, thePainter, PixelPerM);
thePainter->restore();
return;
}
LineParameters lp = labelBoundary();
qreal WW = PixelPerM*lp.Proportional+lp.Fixed;
if (WW < 10) return;
//qreal WWR = qMax(PixelPerM*R->widthOf()*BackgroundScale+BackgroundOffset, PixelPerM*R->widthOf()*ForegroundScale+ForegroundOffset);
QPainterPath textPath;
QPainterPath tranformedRoadPath = *R;
QFont font = getLabelFont();
if (!str.isEmpty()) {
QRegion rg = thePainter->clipRegion();
font.setPixelSize(int(WW));
QFontMetrics metrics(font);
if (font.pixelSize() >= 5 && tranformedRoadPath.length() > metrics.width(str)) {
thePainter->setFont(font);
int repeat = int((tranformedRoadPath.length() / ((metrics.width(str) * LABEL_PATH_DISTANCE))) - 0.5);
int numSegment = repeat+1;
qreal lenSegment = tranformedRoadPath.length() / numSegment;
qreal startSegment = 0;
QPainterPath textPath;
do {
QRegion rg = thePainter->clipRegion();
qreal curLen = startSegment + ((lenSegment - metrics.width(str)) / 2);
int modIncrement = 1;
qreal modAngle = 0;
int modY = 0;
if (cos(angToRad(tranformedRoadPath.angleAtPercent((startSegment+(lenSegment/2))/tranformedRoadPath.length()))) < 0) {
modIncrement = -1;
modAngle = 180.0;
curLen += metrics.width(str);
}
for (int i = 0; i < str.length(); ++i) {
qreal t = tranformedRoadPath.percentAtLength(curLen);
QPointF pt = tranformedRoadPath.pointAtPercent(t);
qreal angle = tranformedRoadPath.angleAtPercent(t);
modY = (metrics.ascent()/2)-3;
QMatrix m;
m.translate(pt.x(), pt.y());
m.rotate(-angle+modAngle);
QPainterPath charPath;
charPath.addText(0, modY, font, str.mid(i, 1));
charPath = charPath * m;
textPath.addPath(charPath);
qreal incremenet = metrics.width(str[i]);
curLen += (incremenet * modIncrement);
}
startSegment += lenSegment;
} while (--repeat >= 0);
if (getLabelHalo()) {
thePainter->setPen(QPen(Qt::white, font.pixelSize()/6));
thePainter->drawPath(textPath);
}
thePainter->setPen(Qt::NoPen);
thePainter->setBrush(LabelColor);
thePainter->drawPath(textPath);
thePainter->setClipRegion(rg);
}
}
if (DrawLabelBackground && !strBg.isEmpty()) {
QRegion rg = thePainter->clipRegion();
font.setPixelSize(int(WW));
QFontMetrics metrics(font);
int repeat = int((tranformedRoadPath.length() / (metrics.width(strBg) * LABEL_STRAIGHT_DISTANCE)) - 0.5);
int numSegment = repeat+1;
qreal lenSegment = tranformedRoadPath.length() / numSegment;
qreal startSegment = 0;
do {
int modX = 0;
int modY = 0;
qreal curLen = startSegment + (lenSegment / 2);
qreal t = tranformedRoadPath.percentAtLength(curLen);
QPointF pt = tranformedRoadPath.pointAtPercent(t);
//.........这里部分代码省略.........
示例4: DrawObj_Item
//.........这里部分代码省略.........
CurX = totalCurveLen - totalTextLen;
CurX -= Extra;
}
if (itemText.defaultStyle().alignment() == 1)
CurX = (totalCurveLen - totalTextLen) / 2.0;
if ((itemText.defaultStyle().alignment() == 3) || (itemText.defaultStyle().alignment() == 4))
extraOffset = (totalCurveLen - Extra - totalTextLen) / static_cast<double>(itemText.length());
}
#ifndef NLS_PROTO
QPainterPath guidePath = PoLine.toQPainterPath(false);
QList<QPainterPath> pathList = decomposePath(guidePath);
QPainterPath currPath = pathList[0];
int currPathIndex = 0;
for (a = firstChar; a < itemText.length(); ++a)
{
CurY = 0;
hl = itemText.item(a);
chstr = hl->ch;
if (chstr[0] == SpecialChars::PAGENUMBER || chstr[0] == SpecialChars::PARSEP || chstr[0] == SpecialChars::PAGECOUNT
|| chstr[0] == SpecialChars::TAB || chstr[0] == SpecialChars::LINEBREAK)
continue;
chs = hl->fontSize();
if (a < itemText.length()-1)
chstr += itemText.text(a+1, 1);
hl->glyph.yadvance = 0;
layoutGlyphs(itemText.charStyle(a), chstr, hl->glyph);
hl->glyph.shrink(); // HACK
if (hl->ch == SpecialChars::OBJECT)
dx = (hl->embedded.getItem()->gWidth + hl->embedded.getItem()->lineWidth()) * hl->glyph.scaleH / 2.0;
else
dx = hl->glyph.wide() / 2.0;
CurX += dx;
double currPerc = currPath.percentAtLength(CurX);
if (currPerc >= 0.9999999)
{
currPathIndex++;
if (currPathIndex == pathList.count())
{
MaxChars = a;
break;
}
currPath = pathList[currPathIndex];
CurX = dx;
currPerc = currPath.percentAtLength(CurX);
}
double currAngle = currPath.angleAtPercent(currPerc);
#if QT_VERSION >= 0x040400
if (currAngle <= 180.0)
currAngle *= -1.0;
else
currAngle = 360.0 - currAngle;
#endif
QPointF currPoint = currPath.pointAtPercent(currPerc);
tangent = FPoint(cos(currAngle * M_PI / 180.0), sin(currAngle * M_PI / 180.0));
point = FPoint(currPoint.x(), currPoint.y());
hl->glyph.xoffset = 0;
hl->PtransX = point.x();
hl->PtransY = point.y();
hl->PRot = currAngle * M_PI / 180.0;
hl->PDx = dx;
QTransform trafo = QTransform( 1, 0, 0, -1, -dx, 0 );
if (textPathFlipped)
trafo *= QTransform(1, 0, 0, -1, 0, 0);
if (textPathType == 0)
trafo *= QTransform( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x(), point.y() ); // ID's Rainbow mode
示例5: paintPair
void SCgAlphabet::paintPair(QPainter *painter, SCgPair *pair)
{
Q_ASSERT(pair != 0);
QVector<QPointF> points = pair->points();
Q_ASSERT(points.size() > 1);
static float arrowLength = 10.f;
static float arrowWidth = LINE_FAT_WIDTH;
if (pair->isOrient())
{
static const QPointF arrowPoints[3] = {QPointF(-arrowWidth / 2.f, 0.f),
QPointF(arrowWidth / 2.f, 0.f),
QPointF(0.f, arrowLength)};
// draw arrow for orient pairs
QLineF line(points[points.size() - 2], points.last());
double angle = ::atan2(line.dx(), line.dy());
painter->save();
painter->translate(line.p2());
painter->rotate(-angle * 180.f / M_PI);
painter->translate(0.f, -arrowLength);
painter->setBrush(QBrush(pair->color(), Qt::SolidPattern));
painter->setPen(Qt::NoPen);
painter->drawConvexPolygon(arrowPoints, 3);
painter->restore();
// correct last point
points.last() -= QPointF((arrowLength) * ::sin(angle), (arrowLength) * ::cos(angle));
}
// get type data
SCgPosType posType = pair->posType();
SCgConstType constType = pair->constType();
SCgPermType permType = pair->permType();
painter->setBrush(Qt::NoBrush);
QPen pen(pair->color());
pen.setCapStyle(Qt::FlatCap);
pen.setJoinStyle(Qt::RoundJoin);
// draw all cases
if (pair->isAccessory())
{
pen.setWidthF(LINE_THIN_WIDTH);
QPen markPen = pen;
if (constType == ConstUnknown && posType == PosUnknown)
{
painter->setPen(pen);
painter->drawPolyline(&(points[0]), points.size());
markPen.setWidthF(LINE_COM_ACCESS_MARK_WIDTH);
markPen.setDashPattern(msCommonAccessoryDashPattern);
painter->setPen(markPen);
painter->drawPolyline(&(points[0]), points.size());
}else
{
if (permType == Permanent && constType == Var)
pen.setDashPattern(msPermVarAccesDashPattern);
if (permType == Temporary)
{
if (constType == Const)
pen.setDashPattern(msTempConstAccesDashPattern);
else
pen.setDashPattern(msTempVarAccesDashPattern);
}
painter->setPen(pen);
painter->drawPolyline(&(points[0]), points.size());
// draw negative lines
if (posType == Negative)
{
painter->setPen(markPen);
QPainterPath path = pair->shapeNormal();
float length = path.length() - arrowLength - 3;
int i = 0;
qreal mult = 28.f;
qreal offset = 22.f;
qreal l = offset;
while (l < length)
{
qreal perc = path.percentAtLength(l);
painter->save();
painter->translate(path.pointAtPercent(perc));
//.........这里部分代码省略.........
示例6: DrawObj_Item
//.........这里部分代码省略.........
else
{
extraOffset = (totalCurveLen - m_textDistanceMargins.left() - totalTextLen) / static_cast<double>(itemRenderText.length());
wordExtra = 0;
}
}
if (itemRenderText.paragraphStyle(0).alignment() == 4)
extraOffset = (totalCurveLen - m_textDistanceMargins.left() - totalTextLen) / static_cast<double>(itemRenderText.length());
}
QPainterPath guidePath = PoLine.toQPainterPath(false);
QList<QPainterPath> pathList = decomposePath(guidePath);
QPainterPath currPath = pathList[0];
int currPathIndex = 0;
for (a = firstChar; a < itemRenderText.length(); ++a)
{
CurY = 0;
GlyphLayout* glyphs = itemRenderText.getGlyphs(a);
PathData* pdata = & (textLayout.point(a));
chstr = itemRenderText.text(a,1);
if (chstr[0] == SpecialChars::PAGENUMBER || chstr[0] == SpecialChars::PARSEP || chstr[0] == SpecialChars::PAGECOUNT
|| chstr[0] == SpecialChars::TAB || chstr[0] == SpecialChars::LINEBREAK)
continue;
if (a < itemRenderText.length()-1)
chstr += itemRenderText.text(a+1, 1);
glyphs->yadvance = 0;
layoutGlyphs(itemRenderText.charStyle(a), chstr, itemRenderText.flags(a), *glyphs);
glyphs->shrink(); // HACK
if (itemRenderText.hasObject(a))
dx = (itemRenderText.object(a)->width() + itemRenderText.object(a)->lineWidth()) * glyphs->scaleH / 2.0;
else
dx = glyphs->wide() / 2.0;
CurX += dx;
double currPerc = currPath.percentAtLength(CurX);
if (currPerc >= 0.9999999)
{
currPathIndex++;
if (currPathIndex == pathList.count())
{
MaxChars = a;
break;
}
currPath = pathList[currPathIndex];
CurX = dx;
currPerc = currPath.percentAtLength(CurX);
}
double currAngle = currPath.angleAtPercent(currPerc);
if (currAngle <= 180.0)
currAngle *= -1.0;
else
currAngle = 360.0 - currAngle;
QPointF currPoint = currPath.pointAtPercent(currPerc);
tangent = FPoint(cos(currAngle * M_PI / 180.0), sin(currAngle * M_PI / 180.0));
point = FPoint(currPoint.x(), currPoint.y());
glyphs->xoffset = 0;
pdata->PtransX = point.x();
pdata->PtransY = point.y();
pdata->PRot = currAngle * M_PI / 180.0;
pdata->PDx = dx;
QTransform trafo = QTransform( 1, 0, 0, -1, -dx, 0 );
if (textPathFlipped)
trafo *= QTransform(1, 0, 0, -1, 0, 0);
if (textPathType == 0)
trafo *= QTransform( tangent.x(), tangent.y(), tangent.y(), -tangent.x(), point.x(), point.y() ); // ID's Rainbow mode
else if (textPathType == 1)
trafo *= QTransform( 1, 0, 0, -1, point.x(), point.y() ); // ID's Stair Step mode