49 #if QWT_VERSION >= 0x060000 51 #include <qwt_plot_histogram.h> 52 #include <qwt_painter.h> 53 #include <qwt_scale_map.h> 61 #include "QwtHistogramm.hh" 63 class Histogram::PrivateData {
74 QwtIntervalSeriesData* data;
75 std::vector<QColor> colors_;
87 QwtPlotItem(QwtText(title))
97 void Histogram::init()
99 d_data =
new PrivateData();
101 setItemAttribute(QwtPlotItem::AutoScale,
true);
102 setItemAttribute(QwtPlotItem::Legend,
true);
107 void Histogram::setBaseline(
double reference)
109 if (d_data->reference != reference) {
110 d_data->reference = reference;
115 double Histogram::baseline()
const 117 return d_data->reference;
126 const QwtIntervalSeriesData* Histogram::data()
const 133 d_data->colors_ = _colors;
137 QColor Histogram::color(uint i)
const 139 if (i < d_data->colors_.size())
140 return d_data->colors_[i];
147 QRectF rect = d_data->data->boundingRect();
151 if (d_data->attributes & Xfy) {
152 rect = QRectF(rect.y(), rect.x(), rect.height(), rect.width());
154 if (rect.left() > d_data->reference)
155 rect.setLeft(d_data->reference);
156 else if (rect.right() < d_data->reference)
157 rect.setRight(d_data->reference);
159 if (rect.bottom() < d_data->reference)
160 rect.setBottom(d_data->reference);
161 else if (rect.top() > d_data->reference)
162 rect.setTop(d_data->reference);
169 int Histogram::rtti()
const 171 return QwtPlotItem::Rtti_PlotHistogram;
174 void Histogram::setHistogramAttribute(HistogramAttribute attribute,
bool on)
176 if (
bool(d_data->attributes & attribute) == on)
180 d_data->attributes |= attribute;
182 d_data->attributes &= ~attribute;
187 bool Histogram::testHistogramAttribute(HistogramAttribute attribute)
const 189 return d_data->attributes & attribute;
192 void Histogram::draw(QPainter *painter,
const QwtScaleMap &xMap,
const QwtScaleMap &yMap,
const QRectF &)
const 194 const QwtIntervalSeriesData &iData = *(d_data->data);
196 const int x0 = xMap.transform(baseline());
197 const int y0 = yMap.transform(baseline());
199 for (
int i = 0; i < (int) iData.size(); i++) {
200 if (d_data->attributes & Histogram::Xfy) {
201 const int x2 = xMap.transform(iData.sample(i).value);
205 int y1 = yMap.transform(iData.sample(i).interval.minValue());
206 int y2 = yMap.transform(iData.sample(i).interval.maxValue());
210 if (i < (
int) iData.size() - 2) {
211 const int yy1 = yMap.transform(iData.sample(i + 1).interval.minValue());
212 const int yy2 = yMap.transform(iData.sample(i + 1).interval.maxValue());
214 if (y2 == qMin(yy1, yy2)) {
215 const int xx2 = xMap.transform(iData.sample(i + 1).interval.minValue());
216 if (xx2 != x0 && ((xx2 < x0 && x2 < x0) || (xx2 > x0 && x2 > x0))) {
223 painter->setPen(QPen(color(i)));
225 drawBar(painter, Qt::Horizontal, QRect(x0, y1, x2 - x0, y2 - y1));
227 const int y2 = yMap.transform(iData.sample(i).value);
231 int x1 = xMap.transform(iData.sample(i).interval.minValue());
232 int x2 = xMap.transform(iData.sample(i).interval.maxValue());
236 if (i < (
int) iData.size() - 2) {
237 const int xx1 = xMap.transform(iData.sample(i + 1).interval.minValue());
238 const int xx2 = xMap.transform(iData.sample(i + 1).interval.maxValue());
240 if (x2 == qMin(xx1, xx2)) {
241 const int yy2 = yMap.transform(iData.sample(i + 1).value);
242 if (yy2 != y0 && ((yy2 < y0 && y2 < y0) || (yy2 > y0 && y2 > y0))) {
249 painter->setPen(QPen(color(i)));
251 drawBar(painter, Qt::Vertical, QRect(x1, y0, x2 - x1, y2 - y0));
260 const QColor color(painter->pen().color());
261 const QRect r = rect.normalized();
263 const int factor = 125;
264 const QColor light(color.light(factor));
265 const QColor dark(color.dark(factor));
267 painter->setBrush(color);
268 painter->setPen(Qt::NoPen);
269 QwtPainter::drawRect(painter, r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2);
270 painter->setBrush(Qt::NoBrush);
272 painter->setPen(QPen(light, 2));
274 QwtPainter::drawLine(painter, r.left() + 1, r.top() + 2, r.right() + 1, r.top() + 2);
276 painter->setPen(QPen(dark, 2));
278 painter->setPen(QPen(light, 1));
280 QwtPainter::drawLine(painter, r.left(), r.top() + 1, r.left(), r.bottom());
281 QwtPainter::drawLine(painter, r.left() + 1, r.top() + 2, r.left() + 1, r.bottom() - 1);
283 painter->setPen(QPen(dark, 1));
285 QwtPainter::drawLine(painter, r.right() + 1, r.top() + 1, r.right() + 1, r.bottom());
286 QwtPainter::drawLine(painter, r.right(), r.top() + 2, r.right(), r.bottom() - 1);
virtual void drawBar(QPainter *, Qt::Orientation o, const QRect &) const
Draws a single bar.
virtual QRectF boundingRect() const
Function hat will return the datas bounding rectangle (for rendering)
void setData(QwtIntervalSeriesData *data)
set data to render
Histogram(const QString &title=QString())
Constructor.
void setColors(std::vector< QColor > &_colors)
Set colors.
virtual ~Histogram()
Destructor.
virtual void draw(QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &) const
The actual draw function, drawing the bars inside the plot widget.