Thanks Uwe, works like a charm
.
Anyone interested here's a trivial example:
Step 1 : subclass QwtSymbol
{
public:
virtual void drawSymbols
( QPainter *,
const QPointF *,
int numPoints
) const;
};
{
}
{
drawSymbols( painter, &pos, 1 );
}
void Symbol
::drawSymbols(QPainter *painter,
const QPointF *points,
int numPoints
) const {
if ( numPoints <= 0 )
return;
painter->save();
painter->setBrush( brush() );
painter->setPen( pen() );
const int sw = sz.width();
const int sh = sz.height();
const int sw2 = sz.width() / 2;
const int sh2 = sz.height() / 2;
path.moveTo(pos);
path.lineTo(pos.x()-sw2,pos.y()); path.lineTo(pos.x(),pos.y()+sh2); path.lineTo(pos);
painter->drawPath(path);
painter->restore();
}
class Symbol:public QwtSymbol
{
public:
Symbol(const QBrush &, const QPen &, const QSize & );
virtual void drawSymbols( QPainter *, const QPointF *, int numPoints ) const;
void drawSymbol( QPainter *, const QPointF & ) const;
};
Symbol::Symbol(const QBrush &br , const QPen &p, const QSize &sz)
: QwtSymbol(QwtSymbol::NoSymbol, br, p, sz)
{
}
void Symbol::drawSymbol(QPainter *painter, const QPointF &pos) const
{
drawSymbols( painter, &pos, 1 );
}
void Symbol::drawSymbols(QPainter *painter, const QPointF *points, int numPoints) const
{
if ( numPoints <= 0 )
return;
painter->save();
painter->setBrush( brush() );
painter->setPen( pen() );
const QSize sz = size();
const int sw = sz.width();
const int sh = sz.height();
const int sw2 = sz.width() / 2;
const int sh2 = sz.height() / 2;
QPointF pos = points[0];
QPainterPath path;
path.moveTo(pos);
path.lineTo(pos.x()-sw2,pos.y()); path.lineTo(pos.x(),pos.y()+sh2); path.lineTo(pos);
painter->drawPath(path);
painter->restore();
}
To copy to clipboard, switch view to plain text mode
Step 2: Subclass QwtMarker
{
public:
Marker();
};
{}
{
symbol().drawSymbol(painter, pos);
}
const QRectF &canvasRect
) const {
const double x = xMap.transform( xValue() );
const double y = yMap.transform( yValue() );
drawAt
( painter, canvasRect,
QPointF( x, y
) );
}
class Marker:public QwtPlotMarker
{
public:
Marker();
void drawAt( QPainter *, const QRectF &, const QPointF & ) const;
virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap,
const QRectF & ) const;
};
Marker::Marker() :QwtPlotMarker()
{}
void Marker::drawAt(QPainter *painter, const QRectF &rect, const QPointF &pos) const
{
symbol().drawSymbol(painter, pos);
QwtPlotMarker::drawAt(painter, rect, pos);
}
void Marker::draw( QPainter *painter,
const QwtScaleMap &xMap, const QwtScaleMap &yMap,
const QRectF &canvasRect ) const
{
const double x = xMap.transform( xValue() );
const double y = yMap.transform( yValue() );
drawAt( painter, canvasRect, QPointF( x, y ) );
}
To copy to clipboard, switch view to plain text mode
Step 3: Instantiate and use
...
...
Marker *mrk = new Marker();
mrk
->setLinePen
(QPen(Qt
::black,
0, Qt
::DashDotLine));
mrk->setValue(10.0,10.0);
mrk->attach(qwt_plot_object);
...
...
Marker *mrk = new Marker();
mrk->setLinePen(QPen(Qt::black, 0, Qt::DashDotLine));
mrk->setValue(10.0,10.0);
mrk->setLineStyle(QwtPlotMarker::HLine);
mrk->setSymbol(new Symbol(QColor(Qt::yellow), QColor(Qt::green), QSize(15,15)));
mrk->attach(qwt_plot_object);
To copy to clipboard, switch view to plain text mode
Bookmarks