MySymbol( QwtSymbol::Style style, const QBrush &brush ) { QPen pen( Qt::black, 0 ); pen.setJoinStyle( Qt::MiterJoin ); pen.setCosmetic( true ); QPainterPath path = createArrow( QSize( 16, 24 ) ); const QSizeF pathSize = path.boundingRect().size(); setSize( 0.8 * pathSize.toSize() ); setPinPoint( QPointF( 0.0, 0.0 ) ); switch( style ) { case QwtSymbol::Pixmap: { const QSize sz = size(); const double ratio = qMin( sz.width() / pathSize.width(), sz.height() / pathSize.height() ); QTransform transform; transform.scale( ratio, ratio ); path = transform.map( path ); if ( isPinPointEnabled() ) { QPointF pos = transform.map( pinPoint() ); setPinPoint( pos ); } const QRectF br = path.boundingRect(); int m = 2 + qCeil( pen.widthF() ); QPixmap pm( sz + QSize( 2 * m, 2 * m ) ); pm.fill( Qt::transparent ); QPainter painter( &pm ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.setPen( pen ); painter.setBrush( brush ); painter.translate( m, m ); painter.translate( -br.left(), br.top() ); painter.drawPath( path ); setPixmap( pm ); setSize( pm.size() ); if ( isPinPointEnabled() ) setPinPoint( pinPoint() + QPointF( m, m ) ); break; } case QwtSymbol::Graphic: { QwtGraphic graphic; graphic.setRenderHint( QwtGraphic::RenderPensUnscaled ); QPainter painter( &graphic ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.setPen( pen ); painter.setBrush( brush ); painter.drawPath( path ); painter.end(); setGraphic( graphic ); break; } case QwtSymbol::SvgDocument: { QBuffer buf; QSvgGenerator generator; generator.setOutputDevice( &buf ); QPainter painter( &generator ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.setPen( pen ); painter.setBrush( brush ); painter.drawPath( path ); painter.end(); setSvgDocument( buf.data() ); break; } case QwtSymbol::Path: default: { setPen( pen ); setBrush( brush ); setPath( path ); } } }
//-------------------------------------------------------------------------------------------------- /// Internal class to support labels on symbols //-------------------------------------------------------------------------------------------------- RiuQwtSymbol::RiuQwtSymbol(PointSymbolEnum riuStyle, const QString& label, LabelPosition labelPosition) : QwtSymbol(QwtSymbol::NoSymbol), m_label(label), m_labelPosition(labelPosition) { QwtSymbol::Style style = QwtSymbol::NoSymbol; switch (riuStyle) { case SYMBOL_ELLIPSE: style = QwtSymbol::Ellipse; break; case SYMBOL_RECT: style = QwtSymbol::Rect; break; case SYMBOL_DIAMOND: style = QwtSymbol::Diamond; break; case SYMBOL_TRIANGLE: style = QwtSymbol::Triangle; break; case SYMBOL_CROSS: style = QwtSymbol::Cross; break; case SYMBOL_XCROSS: style = QwtSymbol::XCross; break; case SYMBOL_DOWN_TRIANGLE: style = QwtSymbol::DTriangle; break; case SYMBOL_LEFT_TRIANGLE: style = QwtSymbol::Path; { QPainterPath path; path.moveTo(0, 0); path.lineTo(-10, 10); path.lineTo(0, 20); path.lineTo(0, 0); setPath(path); setPinPoint(QPointF(0, 0)); } break; case SYMBOL_RIGHT_TRIANGLE: style = QwtSymbol::Path; { QPainterPath path; path.moveTo(0, 0); path.lineTo(10, 10); path.lineTo(0, 20); path.lineTo(0, 0); setPath(path); setPinPoint(QPointF(0, 0)); } break; case SYMBOL_LEFT_ANGLED_TRIANGLE: style = QwtSymbol::Path; { QPainterPath path; path.moveTo(0, 0); path.lineTo(0, 10); path.lineTo(-10, 10); path.lineTo(0, 0); setPath(path); setPinPoint(QPointF(0, 10)); } break; case SYMBOL_RIGHT_ANGLED_TRIANGLE: style = QwtSymbol::Path; { QPainterPath path; path.moveTo(0, 0); path.lineTo(0, 10); path.lineTo(10, 10); path.lineTo(0, 0); setPath(path); setPinPoint(QPointF(0, 10)); } break; case SYMBOL_UP_TRIANGLE: style = QwtSymbol::UTriangle; break; case SYMBOL_STAR1: style = QwtSymbol::Star1; break; case SYMBOL_STAR2: style = QwtSymbol::Star2; break; case SYMBOL_HEXAGON: style = QwtSymbol::Hexagon; break; default: break; } setStyle(style); }