49#if QWT_VERSION >= 0x060000
51#include <qwt_plot_histogram.h>
52#include <qwt_painter.h>
53#include <qwt_scale_map.h>
62#include "QwtHistogramm.hh"
64class Histogram::PrivateData {
75 QwtIntervalSeriesData* data;
76 std::vector<QColor> colors_;
88 QwtPlotItem(QwtText(title))
100 d_data =
new PrivateData();
102 setItemAttribute(QwtPlotItem::AutoScale,
true);
103 setItemAttribute(QwtPlotItem::Legend,
true);
108void Histogram::setBaseline(
double reference)
110 if (d_data->reference != reference) {
111 d_data->reference = reference;
116double Histogram::baseline()
const
118 return d_data->reference;
127const QwtIntervalSeriesData* Histogram::data()
const
134 d_data->colors_ = _colors;
138QColor Histogram::color(uint i)
const
140 if (i < d_data->colors_.size())
141 return d_data->colors_[i];
148 QRectF rect = d_data->data->boundingRect();
152 if (d_data->attributes & Xfy) {
153 rect = QRectF(rect.y(), rect.x(), rect.height(), rect.width());
155 if (rect.left() > d_data->reference)
156 rect.setLeft(d_data->reference);
157 else if (rect.right() < d_data->reference)
158 rect.setRight(d_data->reference);
160 if (rect.bottom() < d_data->reference)
161 rect.setBottom(d_data->reference);
162 else if (rect.top() > d_data->reference)
163 rect.setTop(d_data->reference);
170int Histogram::rtti()
const
172 return QwtPlotItem::Rtti_PlotHistogram;
175void Histogram::setHistogramAttribute(HistogramAttribute attribute,
bool on)
177 if (
bool(d_data->attributes & attribute) == on)
181 d_data->attributes |= attribute;
183 d_data->attributes &= ~attribute;
188bool Histogram::testHistogramAttribute(HistogramAttribute attribute)
const
190 return d_data->attributes & attribute;
193void Histogram::draw(QPainter *painter,
const QwtScaleMap &xMap,
const QwtScaleMap &yMap,
const QRectF &)
const
195 const QwtIntervalSeriesData &iData = *(d_data->data);
197 const int x0 = xMap.transform(baseline());
198 const int y0 = yMap.transform(baseline());
200 for (
int i = 0; i < (int) iData.size(); i++) {
201 if (d_data->attributes & Histogram::Xfy) {
202 const int x2 = xMap.transform(iData.sample(i).value);
206 int y1 = yMap.transform(iData.sample(i).interval.minValue());
207 int y2 = yMap.transform(iData.sample(i).interval.maxValue());
211 if (i < (
int) iData.size() - 2) {
212 const int yy1 = yMap.transform(iData.sample(i + 1).interval.minValue());
213 const int yy2 = yMap.transform(iData.sample(i + 1).interval.maxValue());
215 if (y2 == qMin(yy1, yy2)) {
216 const int xx2 = xMap.transform(iData.sample(i + 1).interval.minValue());
217 if (xx2 != x0 && ((xx2 < x0 && x2 < x0) || (xx2 > x0 && x2 > x0))) {
224 painter->setPen(QPen(color(i)));
226 drawBar(painter, Qt::Horizontal, QRect(x0, y1, x2 - x0, y2 - y1));
228 const int y2 = yMap.transform(iData.sample(i).value);
232 int x1 = xMap.transform(iData.sample(i).interval.minValue());
233 int x2 = xMap.transform(iData.sample(i).interval.maxValue());
237 if (i < (
int) iData.size() - 2) {
238 const int xx1 = xMap.transform(iData.sample(i + 1).interval.minValue());
239 const int xx2 = xMap.transform(iData.sample(i + 1).interval.maxValue());
241 if (x2 == qMin(xx1, xx2)) {
242 const int yy2 = yMap.transform(iData.sample(i + 1).value);
243 if (yy2 != y0 && ((yy2 < y0 && y2 < y0) || (yy2 > y0 && y2 > y0))) {
250 painter->setPen(QPen(color(i)));
252 drawBar(painter, Qt::Vertical, QRect(x1, y0, x2 - x1, y2 - y0));
261 const QColor color(painter->pen().color());
262 const QRect r = rect.normalized();
264 const int factor = 125;
265 const QColor light(color.lighter(factor));
266 const QColor dark(color.darker(factor));
268 painter->setBrush(color);
269 painter->setPen(Qt::NoPen);
270 QwtPainter::drawRect(painter, r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2);
271 painter->setBrush(Qt::NoBrush);
273 painter->setPen(QPen(light, 2));
275 QwtPainter::drawLine(painter, r.left() + 1, r.top() + 2, r.right() + 1, r.top() + 2);
277 painter->setPen(QPen(dark, 2));
279 painter->setPen(QPen(light, 1));
281 QwtPainter::drawLine(painter, r.left(), r.top() + 1, r.left(), r.bottom());
282 QwtPainter::drawLine(painter, r.left() + 1, r.top() + 2, r.left() + 1, r.bottom() - 1);
284 painter->setPen(QPen(dark, 1));
286 QwtPainter::drawLine(painter, r.right() + 1, r.top() + 1, r.right() + 1, r.bottom());
287 QwtPainter::drawLine(painter, r.right(), r.top() + 2, r.right(), r.bottom() - 1);
virtual void draw(QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &) const
The actual draw function, drawing the bars inside the plot widget.
Histogram(const QString &title=QString())
Constructor.
virtual QRectF boundingRect() const
Function hat will return the datas bounding rectangle (for rendering)
void setColors(std::vector< QColor > &_colors)
Set colors.
virtual void drawBar(QPainter *, Qt::Orientation o, const QRect &) const
Draws a single bar.
void setData(QwtIntervalSeriesData *data)
set data to render
virtual ~Histogram()
Destructor.