本文整理汇总了C++中QPainterPath::elementAt方法的典型用法代码示例。如果您正苦于以下问题:C++ QPainterPath::elementAt方法的具体用法?C++ QPainterPath::elementAt怎么用?C++ QPainterPath::elementAt使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类QPainterPath
的用法示例。
在下文中一共展示了QPainterPath::elementAt方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: qwtTransformPath
static QPainterPath qwtTransformPath( const QwtScaleMap &xMap,
const QwtScaleMap &yMap, const QPainterPath &path, bool doAlign )
{
QPainterPath shape;
shape.setFillRule( path.fillRule() );
for ( int i = 0; i < path.elementCount(); i++ )
{
const QPainterPath::Element &element = path.elementAt( i );
double x = xMap.transform( element.x );
double y = yMap.transform( element.y );
switch( element.type )
{
case QPainterPath::MoveToElement:
{
if ( doAlign )
{
x = qRound( x );
y = qRound( y );
}
shape.moveTo( x, y );
break;
}
case QPainterPath::LineToElement:
{
if ( doAlign )
{
x = qRound( x );
y = qRound( y );
}
shape.lineTo( x, y );
break;
}
case QPainterPath::CurveToElement:
{
const QPainterPath::Element& element1 = path.elementAt( ++i );
const double x1 = xMap.transform( element1.x );
const double y1 = yMap.transform( element1.y );
const QPainterPath::Element& element2 = path.elementAt( ++i );
const double x2 = xMap.transform( element2.x );
const double y2 = yMap.transform( element2.y );
shape.cubicTo( x, y, x1, y1, x2, y2 );
break;
}
case QPainterPath::CurveToDataElement:
{
break;
}
}
}
return shape;
}
示例2: labelAttachmentLine
static QLineF labelAttachmentLine( const QPointF ¢er, const QPointF &start, const QPainterPath &label )
{
Q_ASSERT ( label.elementCount() == 5 );
// start is assumed to lie on the outer rim of the slice(!), making it possible to derive the
// radius of the pie
const qreal pieRadius = QLineF( center, start ).length();
// don't draw a line at all when the label is connected to its slice due to at least one of its
// corners falling inside the slice.
for ( int i = 0; i < 4; i++ ) { // point 4 is just a duplicate of point 0
if ( QLineF( label.elementAt( i ), center ).length() < pieRadius ) {
return QLineF();
}
}
// find the closest edge in the polygon, and its two neighbors
QPointF closeCorners[3];
{
QPointF closest = QPointF( 1000000, 1000000 );
int closestIndex = 0; // better misbehave than crash
for ( int i = 0; i < 4; i++ ) { // point 4 is just a duplicate of point 0
QPointF p = label.elementAt( i );
if ( QLineF( p, center ).length() < QLineF( closest, center ).length() ) {
closest = p;
closestIndex = i;
}
}
closeCorners[ 0 ] = label.elementAt( wraparound( closestIndex - 1, 4 ) );
closeCorners[ 1 ] = closest;
closeCorners[ 2 ] = label.elementAt( wraparound( closestIndex + 1, 4 ) );
}
QLineF edge1 = QLineF( closeCorners[ 0 ], closeCorners[ 1 ] );
QLineF edge2 = QLineF( closeCorners[ 1 ], closeCorners[ 2 ] );
QLineF connection1 = QLineF( ( closeCorners[ 0 ] + closeCorners[ 1 ] ) / 2.0, center );
QLineF connection2 = QLineF( ( closeCorners[ 1 ] + closeCorners[ 2 ] ) / 2.0, center );
QLineF ret;
// prefer the connecting line meeting its edge at a more perpendicular angle
if ( normProjection( edge1, connection1 ) < normProjection( edge2, connection2 ) ) {
ret = connection1;
} else {
ret = connection2;
}
// This tends to look a bit better than not doing it *shrug*
ret.setP2( ( start + center ) / 2.0 );
// make the line end at the rim of the slice (not 100% accurate because the line is not precisely radial)
qreal p1Radius = QLineF( ret.p1(), center ).length();
ret.setLength( p1Radius - pieRadius );
return ret;
}
示例3: addPoint
void UBEditableGraphicsPolygonItem::addPoint(const QPointF & point)
{
QPainterPath painterPath = path();
if (painterPath.elementCount() == 0)
{
painterPath.moveTo(point); // For the first point added, we must use moveTo().
setPath(painterPath);
mStartEndPoint[0] = point;
}
else
{
// If clic on first point, close the polygon
// TODO à terme : utiliser la surface de la première poignée.
QPointF pointDepart(painterPath.elementAt(0).x, painterPath.elementAt(0).y);
QPointF pointFin(painterPath.elementAt(painterPath.elementCount()-1).x, painterPath.elementAt(painterPath.elementCount()-1).y);
QGraphicsEllipseItem poigneeDepart(pointDepart.x()-10, pointDepart.y()-10, 20, 20);
QGraphicsEllipseItem poigneeFin(pointFin.x()-10, pointFin.y()-10, 20, 20);
if (poigneeDepart.contains(point))
{
setClosed(true);
}
else
{
if(poigneeFin.contains(point)){
mIsInCreationMode = false;
mOpened = true;
}else{
painterPath.lineTo(point);
setPath(painterPath);
}
}
mStartEndPoint[1] = point;
}
if(!mClosed && !mOpened){
UBFreeHandle *handle = new UBFreeHandle();
addHandle(handle);
handle->setParentItem(this);
handle->setEditableObject(this);
handle->setPos(point);
handle->setId(path().elementCount()-1);
handle->hide();
}
}
示例4: qwtRevertPath
static inline void qwtRevertPath( QPainterPath &path )
{
if ( path.elementCount() == 4 )
{
QPainterPath::Element &el0 =
const_cast<QPainterPath::Element &>( path.elementAt(0) );
QPainterPath::Element &el2 =
const_cast<QPainterPath::Element &>( path.elementAt(3) );
qSwap( el0.x, el2.x );
qSwap( el0.y, el2.y );
}
}
示例5: tryMergePoints
bool tryMergePoints(QPainterPath &path,
const QPointF &startPoint,
const QPointF &endPoint,
qreal &distance,
qreal distanceThreshold,
bool lastSegment)
{
qreal length = (endPoint - startPoint).manhattanLength();
if (lastSegment || length > distanceThreshold) {
if (lastSegment) {
qreal wrappedLength =
(endPoint - QPointF(path.elementAt(0))).manhattanLength();
if (length < distanceThreshold ||
wrappedLength < distanceThreshold) {
return true;
}
}
distance = 0;
return false;
}
distance += length;
if (distance > distanceThreshold) {
path.lineTo(endPoint);
distance = 0;
}
return true;
}
示例6: pathToSvg
QString PolaroidBorderDrawer::pathToSvg(const QPainterPath & path) const
{
int count = path.elementCount();
QString str_path_d;
for (int i = 0; i < count; ++i)
{
QPainterPath::Element e = path.elementAt(i);
switch (e.type)
{
case QPainterPath::LineToElement:
str_path_d.append("L " + QString::number(e.x) + ' ' + QString::number(e.y) + ' ');
break;
case QPainterPath::MoveToElement:
str_path_d.append("M " + QString::number(e.x) + ' ' + QString::number(e.y) + ' ');
break;
case QPainterPath::CurveToElement:
str_path_d.append("C " + QString::number(e.x) + ' ' + QString::number(e.y) + ' ');
break;
case QPainterPath::CurveToDataElement:
str_path_d.append(QString::number(e.x) + ' ' + QString::number(e.y) + ' ');
break;
}
}
str_path_d.append("z");
return str_path_d;
}
示例7: drawPath
void QgsDxfPaintEngine::drawPath( const QPainterPath& path )
{
int pathLength = path.elementCount();
for ( int i = 0; i < pathLength; ++i )
{
const QPainterPath::Element& pathElem = path.elementAt( i );
if ( pathElem.type == QPainterPath::MoveToElement )
{
moveTo( pathElem.x, pathElem.y );
}
else if ( pathElem.type == QPainterPath::LineToElement )
{
lineTo( pathElem.x, pathElem.y );
}
else if ( pathElem.type == QPainterPath::CurveToElement )
{
curveTo( pathElem.x, pathElem.y );
}
else if ( pathElem.type == QPainterPath::CurveToDataElement )
{
mCurrentCurve.append( QPointF( pathElem.x, pathElem.y ) );
}
}
endCurve();
endPolygon();
}
示例8:
//=============================================================================
int sstQt01PathStoreViewCls::AppendPathSymbol(int iKey,
QPainterPath oTmpPath,
sstQt01ShapeType_enum eTmpPathType,
QColor oTmpColor,
QPen oTmpPen)
{
//-----------------------------------------------------------------------------
if ( iKey != 0) return -1;
int iEleNum = oTmpPath.elementCount();
for (int ii =1; ii <= iEleNum; ii++)
{
sstQt01PathElementCsv3Cls oShapeItemCsv;
QPainterPath::Element oElement;
oElement = oTmpPath.elementAt(ii-1);
oShapeItemCsv.setAll(oElement.type,oElement.x,oElement.y, oTmpColor);
if (oElement.type == 0)
{
oShapeItemCsv.setIPenStyle(oTmpPen.style());
oShapeItemCsv.setIPenWidth(oTmpPen.width());
oShapeItemCsv.setShapeType(eTmpPathType);
}
}
return 0;
}
示例9: currentLine
QList<QPointF> Geometry::intersection(QLineF const &line, QPainterPath const &path, qreal eps)
{
QList<QPointF> result;
QPointF startPoint;
QPointF endPoint;
for (int i = 0; i < path.elementCount(); ++i) {
QPainterPath::Element const element = path.elementAt(i);
// Checking that element belongs to the wall path
if (element.isMoveTo()) {
endPoint = QPointF(element.x, element.y);
continue;
}
startPoint = endPoint;
endPoint = QPointF(element.x, element.y);
QLineF currentLine(startPoint, endPoint);
QPointF intersectionPoint;
// TODO: consider curve cases
if (line.intersect(currentLine, &intersectionPoint) != QLineF::NoIntersection
&& belongs(intersectionPoint, currentLine, eps))
{
result << intersectionPoint;
}
}
return result;
}
示例10: drawPath
void QJsonPaintEngine::drawPath(const QPainterPath &path)
{
Q_D(QJsonPaintEngine);
#ifdef QT_PICTURE_DEBUG
qDebug() << " -> drawPath():" << path.boundingRect();
#endif
QString command;
d->s << QString("\t{\"p\": \r\n\t\t[\r\n");
for(int i=0; i< path.elementCount(); i++)
{
QPainterPath::Element e = path.elementAt(i);
switch (e.type)
{
case QPainterPath::MoveToElement:
command = QString("\t\t{\"m\": {\"x\": %1, \"y\":%2}},\r\n").arg(e.x).arg(e.y); break;
case QPainterPath::LineToElement:
command = QString("\t\t{\"l\": {\"x\": %1, \"y\":%2}},\r\n").arg(e.x).arg(e.y); break;
case QPainterPath::CurveToElement:
command = QString("\t\t{\"a\": (\"x1\": %1, \"y1\": %2, \"x2\": %3, \"y2\": %4}},\r\n").arg(d->pos.x()).arg(d->pos.y()).arg(e.x).arg(e.y); break;
case QPainterPath::CurveToDataElement:
command = QString("\t\t{\"ax\": (\"x1\": %1, \"y2\": %2, \"x2\": %3, \"y2\": %4}},\r\n").arg(d->pos.x()).arg(d->pos.y()).arg(e.x).arg(e.y); break;
default: break;
}
d->s << command;
d->pos.setX(e.x);
d->pos.setX(e.y);
}
d->s << QString("\t\t]\r\n\t},\r\n");
}
示例11: testArcMoveTo
void tst_QPainterPath::testArcMoveTo()
{
QFETCH(QRectF, rect);
QFETCH(qreal, angle);
QPainterPath path;
path.arcMoveTo(rect, angle);
path.arcTo(rect, angle, 30);
path.arcTo(rect, angle + 30, 30);
QPointF pos = path.elementAt(0);
QVERIFY((path.elementCount()-1) % 3 == 0);
qreal x_radius = rect.width() / 2.0;
qreal y_radius = rect.height() / 2.0;
QPointF shouldBe = rect.center()
+ QPointF(x_radius * cos(ANGLE(angle)), -y_radius * sin(ANGLE(angle)));
qreal iw = 1 / rect.width();
qreal ih = 1 / rect.height();
QVERIFY(pathFuzzyCompare(pos.x() * iw, shouldBe.x() * iw));
QVERIFY(pathFuzzyCompare(pos.y() * ih, shouldBe.y() * ih));
}
示例12: moved
bool Editor::moved( const QPoint& pos )
{
if ( plot() == NULL )
return false;
const QwtScaleMap xMap = plot()->canvasMap( d_editedItem->xAxis() );
const QwtScaleMap yMap = plot()->canvasMap( d_editedItem->yAxis() );
const QPointF p1 = QwtScaleMap::invTransform( xMap, yMap, d_currentPos );
const QPointF p2 = QwtScaleMap::invTransform( xMap, yMap, pos );
#if QT_VERSION >= 0x040600
const QPainterPath shape = d_editedItem->shape().translated( p2 - p1 );
#else
const double dx = p2.x() - p1.x();
const double dy = p2.y() - p1.y();
QPainterPath shape = d_editedItem->shape();
for ( int i = 0; i < shape.elementCount(); i++ )
{
const QPainterPath::Element &el = shape.elementAt( i );
shape.setElementPositionAt( i, el.x + dx, el.y + dy );
}
#endif
d_editedItem->setShape( shape );
d_currentPos = pos;
return true;
}
示例13: lensDeform
QPainterPath PathDeformRenderer::lensDeform(const QPainterPath &source, const QPointF &offset)
{
QPainterPath path;
path.addPath(source);
qreal flip = m_intensity / qreal(100);
for (int i=0; i<path.elementCount(); ++i) {
const QPainterPath::Element &e = path.elementAt(i);
qreal x = e.x + offset.x();
qreal y = e.y + offset.y();
qreal dx = x - m_pos.x();
qreal dy = y - m_pos.y();
qreal len = m_radius - qSqrt(dx * dx + dy * dy);
if (len > 0) {
path.setElementPositionAt(i,
x + flip * dx * len / m_radius,
y + flip * dy * len / m_radius);
} else {
path.setElementPositionAt(i, x, y);
}
}
return path;
}
示例14: trySimplifyPath
QPainterPath trySimplifyPath(const QPainterPath &path, qreal lengthThreshold)
{
QPainterPath newPath;
QPointF startPoint;
qreal distance = 0;
int count = path.elementCount();
for (int i = 0; i < count; i++) {
QPainterPath::Element e = path.elementAt(i);
QPointF endPoint = QPointF(e.x, e.y);
switch (e.type) {
case QPainterPath::MoveToElement:
newPath.moveTo(endPoint);
break;
case QPainterPath::LineToElement:
if (!tryMergePoints(newPath, startPoint, endPoint,
distance, lengthThreshold, i == count - 1)) {
newPath.lineTo(endPoint);
}
break;
case QPainterPath::CurveToElement: {
Q_ASSERT(i + 2 < count);
if (!tryMergePoints(newPath, startPoint, endPoint,
distance, lengthThreshold, i == count - 1)) {
e = path.elementAt(i + 1);
Q_ASSERT(e.type == QPainterPath::CurveToDataElement);
QPointF ctrl1 = QPointF(e.x, e.y);
e = path.elementAt(i + 2);
Q_ASSERT(e.type == QPainterPath::CurveToDataElement);
QPointF ctrl2 = QPointF(e.x, e.y);
newPath.cubicTo(ctrl1, ctrl2, endPoint);
}
i += 2;
}
default:
;
}
startPoint = endPoint;
}
return newPath;
}
示例15: drawPath
void BitmapImage::drawPath( QPainterPath path, QPen pen, QBrush brush, QPainter::CompositionMode cm, bool antialiasing)
{
int width = pen.width();
qreal inc = 1.0 + width / 20.0; // qreal?
//if (inc<1) { inc=1.0; }
extend( path.controlPointRect().adjusted(-width,-width,width,width).toRect() );
if ( mImage != NULL && !mImage->isNull() )
{
QPainter painter(mImage);
painter.setCompositionMode(cm);
painter.setRenderHint( QPainter::Antialiasing, antialiasing );
painter.setPen(pen);
painter.setBrush(brush);
painter.setTransform(QTransform().translate(-topLeft().x(), -topLeft().y()));
painter.setMatrixEnabled(true);
if (path.length() > 0)
{
for ( int pt = 0; pt < path.elementCount() - 1; pt++ )
{
qreal dx = path.elementAt(pt+1).x - path.elementAt(pt).x;
qreal dy = path.elementAt(pt+1).y - path.elementAt(pt).y;
qreal m = sqrt(dx*dx+dy*dy);
qreal factorx = dx / m;
qreal factory = dy / m;
for ( float h = 0.f; h < m; h += inc )
{
qreal x = path.elementAt(pt).x + factorx * h;
qreal y = path.elementAt(pt).y + factory * h;
painter.drawPoint( QPointF( x, y ) );
}
}
//painter.drawPath( path );
}
else
{
// forces drawing when points are coincident (mousedown)
painter.drawPoint( path.elementAt(0).x, path.elementAt(0).y );
}
painter.end();
}
}