10 #include "qwt_plot_tradingcurve.h" 
   11 #include "qwt_scale_map.h" 
   12 #include "qwt_painter.h" 
   14 #include "qwt_graphic.h" 
   19 static inline bool qwtIsSampleInside( 
const QwtOHLCSample& sample,
 
   20     double tMin, 
double tMax, 
double vMin, 
double vMax )
 
   22     const double t = sample.
time;
 
   25     const bool isOffScreen = ( t < tMin ) || ( t > tMax )
 
   31 class QwtPlotTradingCurve::PrivateData
 
   88     m_data = 
new PrivateData;
 
  111         m_data->paintAttributes |= attribute;
 
  113         m_data->paintAttributes &= ~attribute;
 
  123     return ( m_data->paintAttributes & attribute );
 
  164     if ( style != m_data->symbolStyle )
 
  166         m_data->symbolStyle = style;
 
  179     return m_data->symbolStyle;
 
  196     const QColor& color, qreal width, Qt::PenStyle style )
 
  211     if ( pen != m_data->symbolPen )
 
  213         m_data->symbolPen = pen;
 
  226     return m_data->symbolPen;
 
  239     Direction direction, 
const QBrush& brush )
 
  242     const int index = 
static_cast< int >( direction );
 
  243     if ( index < 0 || index >= 2 )
 
  246     if ( brush != m_data->symbolBrush[ index ] )
 
  248         m_data->symbolBrush[ index ] = brush;
 
  264     const int index = 
static_cast< int >( direction );
 
  265     if ( index < 0 || index >= 2 )
 
  268     return m_data->symbolBrush[ index ];
 
  286     extent = qwtMaxF( 0.0, extent );
 
  287     if ( extent != m_data->symbolExtent )
 
  289         m_data->symbolExtent = extent;
 
  303     return m_data->symbolExtent;
 
  314     width = qwtMaxF( width, 0.0 );
 
  315     if ( width != m_data->minSymbolWidth )
 
  317         m_data->minSymbolWidth = width;
 
  330     return m_data->minSymbolWidth;
 
  343     if ( width != m_data->maxSymbolWidth )
 
  345         m_data->maxSymbolWidth = width;
 
  358     return m_data->maxSymbolWidth;
 
  369         rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() );
 
  389     const QRectF& canvasRect, 
int from, 
int to )
 const 
  403         drawSymbols( painter, xMap, yMap, canvasRect, from, to );
 
  422     const QRectF& canvasRect, 
int from, 
int to )
 const 
  427     double tMin, tMax, vMin, vMax;
 
  430     if ( orient == Qt::Vertical )
 
  452     const bool doClip = m_data->paintAttributes & 
ClipSymbols;
 
  457         symbolWidth = std::floor( 0.5 * symbolWidth ) * 2.0;
 
  459     QPen pen = m_data->symbolPen;
 
  460     pen.setCapStyle( Qt::FlatCap );
 
  462     painter->setPen( pen );
 
  464     for ( 
int i = from; i <= to; i++ )
 
  468         if ( !doClip || qwtIsSampleInside( s, tMin, tMax, vMin, vMax ) )
 
  478             const int brushIndex = ( s.
open < s.
close )
 
  484                 translatedSample.
time = qRound( translatedSample.
time );
 
  485                 translatedSample.
open = qRound( translatedSample.
open );
 
  486                 translatedSample.
high = qRound( translatedSample.
high );
 
  487                 translatedSample.
low = qRound( translatedSample.
low );
 
  488                 translatedSample.
close = qRound( translatedSample.
close );
 
  491             switch( m_data->symbolStyle )
 
  495                     drawBar( painter, translatedSample,
 
  496                         orient, inverted, symbolWidth );
 
  501                     painter->setBrush( m_data->symbolBrush[ brushIndex ] );
 
  503                         orient, symbolWidth );
 
  510                         painter->setBrush( m_data->symbolBrush[ brushIndex ] );
 
  512                             translatedSample, orient, inverted, symbolWidth );
 
  536     Qt::Orientation orientation, 
bool inverted, 
double symbolWidth )
 const 
  542     Q_UNUSED( symbolWidth )
 
  564     bool inverted, 
double width )
 const 
  566     double w2 = 0.5 * width;
 
  626         const QRectF rect( 
sample.
open, t - 0.5 * width,
 
  643     const QSizeF& size )
 const 
  646     return defaultIcon( m_data->symbolPen.color(), size );
 
  666     const QRectF& canvasRect )
 const 
  668     Q_UNUSED( canvasRect );
 
  670     if ( m_data->maxSymbolWidth > 0.0 &&
 
  671         m_data->minSymbolWidth >= m_data->maxSymbolWidth )
 
  673         return m_data->minSymbolWidth;
 
  679     const double pos = map->
transform( map->
s1() + m_data->symbolExtent );
 
  681     double width = qAbs( pos - map->
p1() );
 
  683     width = qwtMaxF( width,  m_data->minSymbolWidth );
 
  684     if ( m_data->maxSymbolWidth > 0.0 )
 
  685         width = qwtMinF( width, m_data->maxSymbolWidth );
 
A paint device for scalable graphics.
A class representing an interval.
Open-High-Low-Close sample used in financial charts.
double high
Highest price.
double open
Opening price.
double close
Closing price.
QwtInterval boundingInterval() const
Calculate the bounding interval of the OHLC values.
static void drawRect(QPainter *, qreal x, qreal y, qreal w, qreal h)
Wrapper for QPainter::drawRect()
static bool roundingAlignment()
static void drawLine(QPainter *, qreal x1, qreal y1, qreal x2, qreal y2)
Wrapper for QPainter::drawLine()
virtual void legendChanged()
void setZ(double z)
Set the z value.
void setItemAttribute(ItemAttribute, bool on=true)
QwtGraphic defaultIcon(const QBrush &, const QSizeF &) const
Return a default icon from a brush.
@ Rtti_PlotTradingCurve
For QwtPlotTradingCurve.
virtual void itemChanged()
@ Legend
The item is represented on the legend.
Base class for plot items representing a series of samples.
Qt::Orientation orientation() const
virtual QRectF boundingRect() const override
QwtPlotTradingCurve illustrates movements in the price of a financial instrument over time.
void setSymbolStyle(SymbolStyle style)
QBrush symbolBrush(Direction) const
bool testPaintAttribute(PaintAttribute) const
void drawBar(QPainter *, const QwtOHLCSample &, Qt::Orientation, bool inverted, double width) const
Draw a bar.
SymbolStyle symbolStyle() const
void drawCandleStick(QPainter *, const QwtOHLCSample &, Qt::Orientation, double width) const
Draw a candle stick.
QFlags< PaintAttribute > PaintAttributes
double minSymbolWidth() const
virtual void drawUserSymbol(QPainter *, SymbolStyle, const QwtOHLCSample &, Qt::Orientation, bool inverted, double symbolWidth) const
Draw a symbol for a symbol style >= UserSymbol.
void setSamples(const QVector< QwtOHLCSample > &)
virtual QwtGraphic legendIcon(int index, const QSizeF &) const override
virtual QRectF boundingRect() const override
virtual void drawSymbols(QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to) const
virtual void drawSeries(QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to) const override
void setMinSymbolWidth(double)
double maxSymbolWidth() const
virtual ~QwtPlotTradingCurve()
Destructor.
void init()
Initialize internal members.
void setSymbolPen(const QColor &, qreal width=0.0, Qt::PenStyle=Qt::SolidLine)
void setSymbolExtent(double)
Set the extent of the symbol.
Direction
Direction of a price movement.
@ Increasing
The closing price is higher than the opening price.
@ Decreasing
The closing price is lower than the opening price.
void setPaintAttribute(PaintAttribute, bool on=true)
virtual double scaledSymbolWidth(const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect) const
void setSymbolBrush(Direction, const QBrush &)
double symbolExtent() const
SymbolStyle
Symbol styles.
@ NoSymbol
Nothing is displayed.
virtual int rtti() const override
void setMaxSymbolWidth(double)
QwtPlotTradingCurve(const QString &title=QString())
@ ClipSymbols
Check if a symbol is on the plot canvas before painting it.
double transform(double s) const
double invTransform(double p) const
Abstract interface for iterating over samples.
QwtOHLCSample sample(int index) const
virtual size_t dataSize() const override
QwtSeriesData< QwtOHLCSample > * data()
void setData(QwtSeriesData< QwtOHLCSample > *series)
A class representing a text.