/*! Draw a histogram in Lines style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style(), setPen() */ void QwtPlotHistogram::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); painter->setPen( d_data->pen ); painter->setBrush( Qt::NoBrush ); for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = d_series->sample( i ); if ( !sample.interval.isNull() ) { const QwtColumnRect rect = columnRect( sample, xMap, yMap ); QRectF r = rect.toRect(); if ( doAlign ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } switch ( rect.direction ) { case QwtColumnRect::LeftToRight: { QwtPainter::drawLine( painter, r.topRight(), r.bottomRight() ); break; } case QwtColumnRect::RightToLeft: { QwtPainter::drawLine( painter, r.topLeft(), r.bottomLeft() ); break; } case QwtColumnRect::TopToBottom: { QwtPainter::drawLine( painter, r.bottomRight(), r.bottomLeft() ); break; } case QwtColumnRect::BottomToTop: { QwtPainter::drawLine( painter, r.topRight(), r.topLeft() ); break; } } } } }
/*! Draw the symbol when it is in Box style. \param painter Painter \param rect Directed rectangle \sa draw() */ void QwtColumnSymbol::drawBox( QPainter *painter, const QwtColumnRect &rect ) const { QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } switch ( d_data->frameStyle ) { case QwtColumnSymbol::Raised: { qwtDrawPanel( painter, r, d_data->palette, d_data->lineWidth ); break; } case QwtColumnSymbol::Plain: { qwtDrawBox( painter, r, d_data->palette, d_data->lineWidth ); break; } default: { painter->fillRect( r, d_data->palette.window() ); } } }
/*! Draw a column for a sample in Columns style(). When a symbol() has been set the symbol is used otherwise the column is displayed as plain rectangle using pen() and brush(). \param painter Painter \param rect Rectangle where to paint the column in paint device coordinates \param sample Sample to be displayed \note In applications, where different intervals need to be displayed in a different way ( f.e different colors or even using differnt symbols) it is recommended to overload drawColumn(). */ void QwtPlotHistogram::drawColumn( QPainter *painter, const QwtColumnRect &rect, const QwtIntervalSample &sample ) const { Q_UNUSED( sample ); if ( d_data->symbol && ( d_data->symbol->style() != QwtColumnSymbol::NoStyle ) ) { d_data->symbol->draw( painter, rect ); } else { QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } QwtPainter::drawRect( painter, r ); } }
void Plot2DHistogram::drawColumn (QPainter * painter, const QwtColumnRect & rect, const QwtIntervalSample & sample) const{ QBrush brush( m_defaultColor ); if ( !m_colored ){ painter->setPen( m_defaultColor); } else { QColor sampleColor(m_defaultColor); if ( m_pipeline ){ QwtInterval xRange = sample.interval; double midPt = (xRange.minValue() + xRange.maxValue()) / 2; std::array<double,3> normRGB; m_pipeline->convert( midPt, normRGB ); if ( normRGB[0] >= 0 && normRGB[1] >= 0 && normRGB[2] >= 0 ){ sampleColor.setRgbF(normRGB[0], normRGB[1], normRGB[2]); } } painter->setPen( sampleColor ); brush.setColor( sampleColor ); } painter->setBrush( brush ); QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ){ r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } if ( m_drawStyle == Carta::Data::PlotStyles::PLOT_STYLE_FILL ){ QwtPainter::fillRect( painter, r, brush ); } else if ( m_drawStyle == Carta::Data::PlotStyles::PLOT_STYLE_LINE ){ double middle = ( r.left() + r.right() ) / 2; QwtPainter::drawLine( painter, middle, r.bottom(), middle, r.top() ); } else if ( m_drawStyle != Carta::Data::PlotStyles::PLOT_STYLE_OUTLINE ){ qCritical() << "Unrecognized draw style="<< m_drawStyle; } if ( m_drawStyle == Carta::Data::PlotStyles::PLOT_STYLE_OUTLINE || ( m_drawStyle == Carta::Data::PlotStyles::PLOT_STYLE_FILL && m_colored ) ){ //Draw a black outline for colored fill style if ( m_drawStyle == Carta::Data::PlotStyles::PLOT_STYLE_FILL && m_colored ){ QColor outlineC( "black" ); painter->setPen( outlineC ); } //Draw the top double top = r.top(); double right = r.right(); QwtPainter::drawLine( painter, r.left(), top, r.right(), top ); //Draw the left vertical line QwtPainter::drawLine( painter, r.left(), m_lastY, r.left(), top ); //Store the top for the next call. if ( top > 0 ){ m_lastY = top; } if ( right > 0 ){ m_lastX = right; } } }