diff --git a/examples/charts/colormap/main.cpp b/examples/charts/colormap/main.cpp --- a/examples/charts/colormap/main.cpp +++ b/examples/charts/colormap/main.cpp @@ -40,22 +40,25 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); QVector *xSeries = new QVector(); + xSeries->reserve(1028); for(int i=0;i<1028;i++) { - xSeries->append(i*5.0); + xSeries->append(i); } QVector *ySeries = new QVector(); + ySeries->reserve(768); for(int i=0;i<768;i++) { - ySeries->append(i*10.0); + ySeries->append(i); } QVector *zSeries = new QVector(); + zSeries->reserve(1028*768); for(int i=0;i<1028*768;i++) { - // if(i%2 != 1) - // zSeries->append(0); - // else - // zSeries->append(1); +// if(i%2 != 1) +// zSeries->append(0); +// else +// zSeries->append(1); zSeries->append(i); } @@ -79,6 +82,5 @@ int main(int argc, char *argv[]) window.resize(100-77, 100-53); window.show(); - return a.exec(); } diff --git a/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp b/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp --- a/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp +++ b/src/charts/axis/colorbaraxis/chartcolorbaraxisy.cpp @@ -10,10 +10,12 @@ QT_CHARTS_BEGIN_NAMESPACE -ChartColorBarAxisY::ChartColorBarAxisY(QColorBarAxis *axis, QLinearGradient gradient, QGraphicsItem *item) +ChartColorBarAxisY::ChartColorBarAxisY(QColorBarAxis *axis, QPoint pos, qreal height, QLinearGradient gradient, QGraphicsItem *item) : VerticalAxis(axis, item), m_axis(axis), - m_gradient(gradient) + m_gradient(gradient), + m_position(pos), + m_height(height) { QObject::connect(m_axis, SIGNAL(tickCountChanged(int)), this, SLOT(handleTickCountChanged(int))); QObject::connect(m_axis, SIGNAL(minorTickCountChanged(int)), @@ -94,7 +96,7 @@ QSizeF ChartColorBarAxisY::sizeHint(Qt:: QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), QStringLiteral("..."), axis()->labelsAngle()); - width = boundingRect.width() + labelPadding() + base.width() + 1.0; + width = boundingRect.width() + labelPadding() + base.width() + 61.0; //TODO : hint changed 1.0 to 61.0 height = boundingRect.height() / 2.0; sh = QSizeF(width, height); break; @@ -109,7 +111,7 @@ QSizeF ChartColorBarAxisY::sizeHint(Qt:: if (firstHeight < 0.0) firstHeight = height; } - width = labelWidth + labelPadding() + base.width() + 2.0; //two pixels of tolerance + width = labelWidth + labelPadding() + base.width() + 62.0; //two pixels of tolerance //TODO : hint changed 2.0 to 62.0 height = qMax(height, firstHeight) / 2.0; sh = QSizeF(width, height); break; @@ -122,23 +124,25 @@ QSizeF ChartColorBarAxisY::sizeHint(Qt:: void ChartColorBarAxisY::createColorBar() { - QGradientStops stops = m_gradient.stops(); + //m_position.setX(80+m_position.x());// TODO : remove this when you know how to move labels - QLinearGradient gradient(0,0,1,250); + //gradient + QGradientStops stops = m_gradient.stops(); + QLinearGradient gradient(0,0,1,m_height); foreach(QGradientStop stop, stops) { gradient.setColorAt(1-stop.first,stop.second); } - QPixmap image = QPixmap(50,250); - QPainter painter(&image); - QRectF rect(0,0,50,250); - painter.fillRect(rect,gradient); + //colorbar + QRectF rect(m_position.x(),m_position.y(),m_height/20,m_height); QGraphicsRectItem *colorbar = new QGraphicsRectItem(rect, this); + colorbar->setZValue(ChartPresenter::AxisZValue); + colorbar->setBrush(gradient); setGraphicsItem(colorbar); } #include "moc_chartcolorbaraxisy_p.cpp" -QT_CHARTS_END_NAMESPACE + QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h b/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h --- a/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h +++ b/src/charts/axis/colorbaraxis/chartcolorbaraxisy_p.h @@ -12,7 +12,7 @@ class ChartColorBarAxisY : public Vertic { Q_OBJECT public: - ChartColorBarAxisY(QColorBarAxis *axis, QLinearGradient gradient, QGraphicsItem *item = 0); + ChartColorBarAxisY(QColorBarAxis *axis, QPoint pos, qreal height, QLinearGradient gradient, QGraphicsItem *item = 0); ~ChartColorBarAxisY(); QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; @@ -32,6 +32,8 @@ private Q_SLOTS: private: QColorBarAxis *m_axis; QLinearGradient m_gradient; + QPoint m_position; + qreal m_height; }; QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp b/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp --- a/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis.cpp @@ -18,10 +18,10 @@ QT_CHARTS_BEGIN_NAMESPACE /*! Constructs an axis object which is a child of \a parent. */ -QColorBarAxis::QColorBarAxis(QLinearGradient gradient, qreal min, qreal max,QObject *parent) : - QAbstractAxis(*new QColorBarAxisPrivate(gradient, min, max, this), parent) +QColorBarAxis::QColorBarAxis(QRectF plotArea, QLinearGradient gradient, qreal min, qreal max, QObject *parent) : + QAbstractAxis(*new QColorBarAxisPrivate(plotArea, gradient, min, max, this), parent) { - +setGridLineVisible(false); } /*! @@ -130,14 +130,15 @@ QAbstractAxis::AxisType QColorBarAxis::t ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -QColorBarAxisPrivate::QColorBarAxisPrivate(QLinearGradient gradient, qreal min, qreal max, QColorBarAxis *q) +QColorBarAxisPrivate::QColorBarAxisPrivate(QRectF plotArea, QLinearGradient gradient, qreal min, qreal max, QColorBarAxis *q) : QAbstractAxisPrivate(q), + m_plotArea(plotArea), m_min(min), m_max(max), - m_tickCount(5), - m_minorTickCount(0), + m_tickCount(5), + m_minorTickCount(0), m_format(QString::null), - // m_applying(false) + // m_applying(false) m_gradient(gradient) { @@ -155,7 +156,14 @@ void QColorBarAxisPrivate::initializeGra setAlignment(Qt::AlignRight); //also set orientation (Vertical in this case) - axis = new ChartColorBarAxisY(q, m_gradient, parent); + //TODO : change this position + qreal x1; + qreal y1; + qreal x2; + qreal y2; + m_plotArea.getCoords(&x1,&y1,&x2,&y2); + QPoint pos(x2+5,y1); + axis = new ChartColorBarAxisY(q, pos, m_plotArea.height(),m_gradient, parent); m_item.reset(axis); QAbstractAxisPrivate::initializeGraphics(parent); @@ -165,12 +173,12 @@ void QColorBarAxisPrivate::initializeDom { //domain is not supposed to have a rangeZ -// if (orientation() == Qt::Vertical) { -// if (!qFuzzyIsNull(m_max - m_min)) -// domain->setRangeY(m_min, m_max); -// else -// setRange(domain->minY(), domain->maxY()); -// } + // if (orientation() == Qt::Vertical) { + // if (!qFuzzyIsNull(m_max - m_min)) + // domain->setRangeY(m_min, m_max); + // else + // setRange(domain->minY(), domain->maxY()); + // } } void QColorBarAxisPrivate::setMin(const QVariant &min) diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis.h b/src/charts/axis/colorbaraxis/qcolorbaraxis.h --- a/src/charts/axis/colorbaraxis/qcolorbaraxis.h +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis.h @@ -11,7 +11,7 @@ class QT_CHARTS_EXPORT QColorBarAxis : p { Q_OBJECT public: - explicit QColorBarAxis(QLinearGradient gradient, qreal min, qreal max,QObject *parent = 0); + explicit QColorBarAxis(QRectF plotArea,QLinearGradient gradient, qreal min, qreal max,QObject *parent = 0); ~QColorBarAxis(); protected: diff --git a/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h b/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h --- a/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h +++ b/src/charts/axis/colorbaraxis/qcolorbaraxis_p.h @@ -11,7 +11,7 @@ class QColorBarAxisPrivate : public QAbs { Q_OBJECT public: - QColorBarAxisPrivate(QLinearGradient gradient, qreal min, qreal max,QColorBarAxis *q); + QColorBarAxisPrivate(QRectF plotArea, QLinearGradient gradient, qreal min, qreal max,QColorBarAxis *q); ~QColorBarAxisPrivate(); public: @@ -35,6 +35,7 @@ private: QString m_format; // bool m_applying; QLinearGradient m_gradient; + QRectF m_plotArea; Q_DECLARE_PUBLIC(QColorBarAxis) }; diff --git a/src/charts/colormapchart/colormapchart.cpp b/src/charts/colormapchart/colormapchart.cpp --- a/src/charts/colormapchart/colormapchart.cpp +++ b/src/charts/colormapchart/colormapchart.cpp @@ -7,9 +7,6 @@ #include #include -//#include TODO : fix this -#include "qcolorbaraxis.h" - #include #define nbOfColors 65000 @@ -56,6 +53,10 @@ void ColorMapChart::paint(QPainter *pain Q_UNUSED(widget) Q_UNUSED(option) + m_series->setUseOpenGL(); + + painter->save(); + QRectF clipRect = QRectF(QPointF(0, 0), domain()->size()); painter->setClipRect(clipRect); @@ -64,37 +65,54 @@ void ColorMapChart::paint(QPainter *pain //http://doc.qt.io/qt-4.8/qimage.html#details :Warning: This will create a QImage with uninitialized data. Call fill() to fill the image with an appropriate pixel value before drawing onto it with QPainter. colorMapImage.fill(QColor(Qt::white).rgb()); - ColorMapDataPart * grid = m_series->getUniformGrid(0,0,plotAreaRect.width(),plotAreaRect.height(),QColorMapSeries::LastPixel); + QElapsedTimer timer; + timer.start(); + + QVector * grid = m_series->getUniformGrid(0,0,plotAreaRect.width(),plotAreaRect.height(),QColorMapSeries::LastPixel); + + int msec = timer.elapsed(); + int msec2 = 0+msec; double maxZ = m_series->maxZ(); double minZ = m_series->minZ(); double rangeZ = maxZ - minZ; - for(int i=0;idataSeries().at(i+j*(colorMapImage.width())); + double value = grid->at(i+j*(imageWidth)); double pix=((value-minZ)/rangeZ); int indexInColorTable = pix*(nbOfColors-1); colorMapImage.setPixel(i,j,m_colorTable->at(indexInColorTable)); } } - if(!m_colorbar) - addColorBar(); + addColorBar(plotAreaRect); + painter->drawImage(clipRect,colorMapImage); - update(); + update();//Qt docs: Warning: If you call repaint() in a function which may itself be called from paintEvent(), you may get infinite recursion. The update() function never causes recursion + + painter->restore(); + + } -void ColorMapChart::addColorBar() +void ColorMapChart::addColorBar(QRectF plotAreaRect) { double maxZ = m_series->maxZ(); double minZ = m_series->minZ(); - QColorBarAxis *colorbar = new QColorBarAxis(createColorMapGradient(m_gradientType),minZ, maxZ,this); - m_series->chart()->addAxis(colorbar, Qt::AlignRight); - m_colorbar = true; + + if(m_isColorBarDrawn) + m_series->chart()->removeAxis(m_colorbar); + + m_colorbar = new QColorBarAxis(plotAreaRect,createColorMapGradient(m_gradientType),minZ, maxZ,this); + m_series->chart()->addAxis(m_colorbar, Qt::AlignRight); + m_isColorBarDrawn = true; } /*! diff --git a/src/charts/colormapchart/colormapchart_p.h b/src/charts/colormapchart/colormapchart_p.h --- a/src/charts/colormapchart/colormapchart_p.h +++ b/src/charts/colormapchart/colormapchart_p.h @@ -7,6 +7,9 @@ #include #include +//#include TODO : fix this +#include "qcolorbaraxis.h" + QT_CHARTS_BEGIN_NAMESPACE class ChartPresenter; @@ -56,7 +59,7 @@ Q_SIGNALS: private: inline bool isEmpty(); - void addColorBar(); + void addColorBar(QRectF plotAreaRect); QLinearGradient createColorMapGradient(GradientType gradientType); void changeGradient(GradientType gradientType); @@ -67,7 +70,8 @@ protected: bool m_dirty; QVector *m_colorTable; GradientType m_gradientType; - bool m_colorbar; + bool m_isColorBarDrawn; + QColorBarAxis *m_colorbar; }; //class PixmapMarker: public QGraphicsRectItem diff --git a/src/charts/colormapchart/qcolormapseries.cpp b/src/charts/colormapchart/qcolormapseries.cpp --- a/src/charts/colormapchart/qcolormapseries.cpp +++ b/src/charts/colormapchart/qcolormapseries.cpp @@ -120,7 +120,7 @@ QColorMapSeries &QColorMapSeries::operat from the position \a xpos , \a ypos (starting at the top left corner of the plot area).\n When there are more points than pixels, \a strategy is applied to determine which to choose. */ -ColorMapDataPart *QColorMapSeries::getUniformGrid(int xpos, int ypos,int width, int height, QColorMapSeries::Strategy strategy) +QVector *QColorMapSeries::getUniformGrid(int xpos, int ypos,int width, int height, QColorMapSeries::Strategy strategy) { Q_D(QColorMapSeries); return d->getUniformGrid(xpos, ypos,width,height, strategy); @@ -433,14 +433,9 @@ QAbstractAxis* QColorMapSeriesPrivate::c } -ColorMapDataPart *QColorMapSeriesPrivate::getUniformGrid(int xpos, int ypos, int width, int height, QColorMapSeries::Strategy strategy) +QVector *QColorMapSeriesPrivate::getUniformGrid(int xpos, int ypos, int width, int height, QColorMapSeries::Strategy strategy) { - // QVector *timeSeries = new QVector(width); - // QVector *ySeries = new QVector(height); - QVector *dataSeries = new QVector(width*height); - QVector *timeSeries = new QVector(); - QVector *ySeries = new QVector(); - ColorMapDataPart* grid = new ColorMapDataPart(timeSeries,ySeries,dataSeries); + QVector *grid = new QVector(width*height); double dx = (m_maxX - m_minX)/(double)width; double dy = (m_maxY - m_minY)/(double)height; @@ -448,15 +443,12 @@ ColorMapDataPart *QColorMapSeriesPrivate int x=0; int y=0; - for(int i=0;iappend((double)i); - } +QVector cluster; +cluster.reserve(height*width/1000); - - for (auto cell= dataSeries->begin();cellend();++cell) + for (auto cell= grid->begin();cellend();++cell) { - QVector cluster; + cluster.resize(0); this->buildCluster(x,y,dx,dy,cluster); if(strategy == QColorMapSeries::LastPixel) *cell=this->clusterStrategyLast(cluster); @@ -471,11 +463,10 @@ ColorMapDataPart *QColorMapSeriesPrivate else { x=0; - ySeries->append((double)y); y++; - } } + return grid; } @@ -598,6 +589,8 @@ void QColorMapSeriesPrivate::buildClust QPair xRange = dataPart->getRange(dataPart->timesSeries(),m_minX+xpos*dx,m_minX+(xpos+1)*dx); QPair yRange = dataPart->getRange(dataPart->ySeries(),m_maxY-(ypos+1)*dy,m_maxY-ypos*dy); + int timeSeriesSize = dataPart->timesSeries().size(); + if(xRange.first != xRange.second && yRange.first != yRange.second) { for(int i =xRange.first+1;iySeries()[j]; - qreal val=dataPart->dataSeries()[ i + (dataPart->timesSeries().size() * j)]; + qreal val=dataPart->dataSeries()[ i + (timeSeriesSize * j)]; cluster.append(Point3D(xval,yval,val)); } } diff --git a/src/charts/colormapchart/qcolormapseries.h b/src/charts/colormapchart/qcolormapseries.h --- a/src/charts/colormapchart/qcolormapseries.h +++ b/src/charts/colormapchart/qcolormapseries.h @@ -48,8 +48,8 @@ public : QColorMapSeries &operator << (const ColorMapDataPart &dataPart); QColorMapSeries &operator << (const QList &dataParts); - ColorMapDataPart* getUniformGrid(int xpos, int ypos,int width, int height, Strategy strategy); - //double getUniformGrid(int width, int height, Strategy lambda); + QVector *getUniformGrid(int xpos, int ypos,int width, int height, Strategy strategy); + // QVector *getUniformGrid(int width, int height, Strategy lambda); // virtual void attachAxis(QAbstractAxis *axis); diff --git a/src/charts/colormapchart/qcolormapseries_p.h b/src/charts/colormapchart/qcolormapseries_p.h --- a/src/charts/colormapchart/qcolormapseries_p.h +++ b/src/charts/colormapchart/qcolormapseries_p.h @@ -31,7 +31,7 @@ public : QAbstractAxis::AxisType defaultAxisType(Qt::Orientation orientation) const; QAbstractAxis* createDefaultAxis(Qt::Orientation) const; - ColorMapDataPart* getUniformGrid(int xpos, int ypos,int width, int height, QColorMapSeries::Strategy strategy); + QVector *getUniformGrid(int xpos, int ypos,int width, int height, QColorMapSeries::Strategy strategy); Q_SIGNALS: void updated(); @@ -55,8 +55,6 @@ private: double m_minZ; double m_maxZ; void recomputeDataRange(); - QPair getLastX(double start, double end); - int getLastY(int x,double start, double end); double clusterStrategyLast(QVector& cluster); double clusterStrategyMean(QVector &cluster); double clusterStrategyMedian(QVector& cluster);