qchartview.cpp
351 lines
| 9.8 KiB
| text/x-c
|
CppLexer
/ src / qchartview.cpp
Michal Klocek
|
r58 | #include "qchartview.h" | ||
#include "qchart.h" | ||||
Michal Klocek
|
r176 | #include "qchartaxis.h" | ||
Michal Klocek
|
r58 | #include <QGraphicsView> | ||
#include <QGraphicsScene> | ||||
#include <QRubberBand> | ||||
#include <QResizeEvent> | ||||
#include <QDebug> | ||||
Marek Rosa
|
r287 | /*! | ||
\enum QChartView::RubberBandPolicy | ||||
This enum describes the different types of rubber bands that can be used for zoom rect selection | ||||
\value NoRubberBand | ||||
\value VerticalRubberBand | ||||
\value HorizonalRubberBand | ||||
\value RectangleRubberBand | ||||
*/ | ||||
Marek Rosa
|
r233 | /*! | ||
\class QChartView | ||||
Marek Rosa
|
r287 | \brief Standalone charting widget. | ||
Marek Rosa
|
r274 | |||
Tero Ahola
|
r321 | QChartView is a standalone widget that can display charts. It does not require separate | ||
QGraphicsScene to work. It manages the graphical representation of different types of | ||||
QChartSeries and other chart related objects like QChartAxis and QChartLegend. If you want to | ||||
display a chart in your existing QGraphicsScene, you can use the QChart class instead. | ||||
Marek Rosa
|
r274 | |||
\sa QChart | ||||
Marek Rosa
|
r233 | */ | ||
Michal Klocek
|
r58 | QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||
Marek Rosa
|
r285 | /*! | ||
Constructs a chartView object which is a child of a\a parent. | ||||
*/ | ||||
Michal Klocek
|
r58 | QChartView::QChartView(QWidget *parent) : | ||
Michal Klocek
|
r176 | QGraphicsView(parent), | ||
Jani Honkonen
|
r204 | m_scene(new QGraphicsScene(this)), | ||
Michal Klocek
|
r176 | m_chart(new QChart()), | ||
m_rubberBand(0), | ||||
m_verticalRubberBand(false), | ||||
m_horizonalRubberBand(false) | ||||
{ | ||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | ||||
Michal Klocek
|
r58 | setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | ||
setScene(m_scene); | ||||
m_chart->setMargin(50); | ||||
m_scene->addItem(m_chart); | ||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | ||||
} | ||||
Marek Rosa
|
r277 | |||
/*! | ||||
Destroys the object and it's children, like QChartSeries and QChartAxis object added to it. | ||||
*/ | ||||
Michal Klocek
|
r58 | QChartView::~QChartView() | ||
{ | ||||
} | ||||
Marek Rosa
|
r287 | /*! | ||
Resizes and updates the chart area using the \a event data | ||||
*/ | ||||
Michal Klocek
|
r58 | void QChartView::resizeEvent(QResizeEvent *event) | ||
{ | ||||
m_scene->setSceneRect(0,0,size().width(),size().height()); | ||||
Michal Klocek
|
r115 | m_chart->resize(size()); | ||
Michal Klocek
|
r58 | QWidget::resizeEvent(event); | ||
} | ||||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r285 | Adds the \a series and optional \a axisY onto the chart and takes the ownership of the objects. | ||
Marek Rosa
|
r274 | If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and | ||
the y axis). | ||||
Marek Rosa
|
r285 | \sa removeSeries(), removeAllSeries() | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r360 | void QChartView::addSeries(QSeries* series,QChartAxis *axisY) | ||
Michal Klocek
|
r58 | { | ||
Michal Klocek
|
r223 | m_chart->addSeries(series,axisY); | ||
Michal Klocek
|
r58 | } | ||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r285 | Removes the \a series specified in a perameter from the QChartView. | ||
Marek Rosa
|
r274 | It releses its ownership of the specified QChartSeries object. | ||
It does not delete the pointed QChartSeries data object | ||||
Marek Rosa
|
r285 | \sa addSeries(), removeAllSeries() | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r360 | void QChartView::removeSeries(QSeries* series) | ||
Michal Klocek
|
r245 | { | ||
m_chart->removeSeries(series); | ||||
} | ||||
Marek Rosa
|
r274 | /*! | ||
Removes all the QChartSeries that have been added to the QChartView | ||||
It also deletes the pointed QChartSeries data objects | ||||
\sa addSeries(), removeSeries() | ||||
*/ | ||||
Michal Klocek
|
r258 | void QChartView::removeAllSeries() | ||
{ | ||||
m_chart->removeAllSeries(); | ||||
} | ||||
Marek Rosa
|
r285 | /*! | ||
Zooms in the view by a factor of 2 | ||||
*/ | ||||
Michal Klocek
|
r223 | void QChartView::zoomIn() | ||
Michal Klocek
|
r58 | { | ||
Michal Klocek
|
r223 | m_chart->zoomIn(); | ||
Michal Klocek
|
r58 | } | ||
Marek Rosa
|
r285 | /*! | ||
Zooms in the view to a maximum level at which \a rect is still fully visible. | ||||
*/ | ||||
Michal Klocek
|
r223 | void QChartView::zoomIn(const QRect& rect) | ||
Michal Klocek
|
r58 | { | ||
Michal Klocek
|
r223 | m_chart->zoomIn(rect); | ||
Michal Klocek
|
r58 | } | ||
Marek Rosa
|
r285 | /*! | ||
Restores the view zoom level to the previous one. | ||||
*/ | ||||
Michal Klocek
|
r67 | void QChartView::zoomOut() | ||
Michal Klocek
|
r58 | { | ||
Michal Klocek
|
r67 | m_chart->zoomOut(); | ||
Michal Klocek
|
r58 | } | ||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r277 | Returns the chart margin, which is the distance between the widget edge and the part of the chart where the actual data can be displayed. | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r67 | int QChartView::margin() const | ||
{ | ||||
return m_chart->margin(); | ||||
} | ||||
Michal Klocek
|
r69 | |||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r285 | Sets the chart \a title. A description text that is rendered above the chart. | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r192 | void QChartView::setChartTitle(const QString& title) | ||
Michal Klocek
|
r69 | { | ||
Michal Klocek
|
r192 | m_chart->setChartTitle(title); | ||
} | ||||
Marek Rosa
|
r274 | /*! | ||
Marek Rosa
|
r277 | Sets the \a font that is used for rendering the description text that is rendered above the chart. | ||
Marek Rosa
|
r274 | */ | ||
Michal Klocek
|
r192 | void QChartView::setChartTitleFont(const QFont& font) | ||
{ | ||||
m_chart->setChartTitleFont(font); | ||||
Michal Klocek
|
r69 | } | ||
Marek Rosa
|
r277 | /*! | ||
Sets the \a brush that is used for painting the background of the chart area of the QChartView widget. | ||||
*/ | ||||
Michal Klocek
|
r122 | void QChartView::setChartBackgroundBrush(const QBrush& brush) | ||
{ | ||||
Michal Klocek
|
r176 | m_chart->setChartBackgroundBrush(brush); | ||
Michal Klocek
|
r122 | } | ||
Marek Rosa
|
r277 | |||
/*! | ||||
Sets the \a pen that is used for painting the background of the chart area of the QChartView widget. | ||||
*/ | ||||
Michal Klocek
|
r122 | void QChartView::setChartBackgroundPen(const QPen& pen) | ||
{ | ||||
Michal Klocek
|
r176 | m_chart->setChartBackgroundPen(pen); | ||
Michal Klocek
|
r122 | } | ||
Michal Klocek
|
r136 | |||
Marek Rosa
|
r285 | /*! | ||
Sets the RubberBandPlicy to \a policy. Selected policy determines the way zooming is performed. | ||||
*/ | ||||
Michal Klocek
|
r136 | void QChartView::setRubberBandPolicy(const RubberBandPolicy policy) | ||
{ | ||||
Michal Klocek
|
r176 | switch(policy) { | ||
Michal Klocek
|
r136 | case VerticalRubberBand: | ||
Michal Klocek
|
r176 | m_verticalRubberBand = true; | ||
m_horizonalRubberBand = false; | ||||
break; | ||||
Michal Klocek
|
r136 | case HorizonalRubberBand: | ||
Michal Klocek
|
r176 | m_verticalRubberBand = false; | ||
m_horizonalRubberBand = true; | ||||
break; | ||||
Michal Klocek
|
r136 | case RectangleRubberBand: | ||
Michal Klocek
|
r176 | m_verticalRubberBand = true; | ||
m_horizonalRubberBand = true; | ||||
break; | ||||
Michal Klocek
|
r136 | case NoRubberBand: | ||
default: | ||||
Michal Klocek
|
r176 | delete m_rubberBand; | ||
m_rubberBand=0; | ||||
m_horizonalRubberBand = false; | ||||
m_verticalRubberBand = false; | ||||
return; | ||||
Michal Klocek
|
r136 | } | ||
Michal Klocek
|
r176 | if(!m_rubberBand) { | ||
m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this); | ||||
m_rubberBand->setEnabled(true); | ||||
Michal Klocek
|
r138 | } | ||
Michal Klocek
|
r136 | } | ||
Marek Rosa
|
r285 | /*! | ||
Returns the RubberBandPolicy that is currently being used by the widget. | ||||
*/ | ||||
Michal Klocek
|
r136 | QChartView::RubberBandPolicy QChartView::rubberBandPolicy() const | ||
{ | ||||
if(m_horizonalRubberBand && m_verticalRubberBand) return RectangleRubberBand; | ||||
if(m_horizonalRubberBand) return HorizonalRubberBand; | ||||
if(m_verticalRubberBand) return VerticalRubberBand; | ||||
return NoRubberBand; | ||||
} | ||||
Marek Rosa
|
r285 | /*! | ||
If Left mouse button is pressed and the RubberBandPolicy is enabled the \a event is accepted and the rubber band is displayed on the screen allowing the user to select the zoom area. | ||||
Marek Rosa
|
r287 | If different mouse button is pressed and/or the RubberBandPolicy is disabled then the \a event is passed to QGraphicsView::mousePressEvent() implementation is called. | ||
Marek Rosa
|
r285 | */ | ||
Michal Klocek
|
r136 | void QChartView::mousePressEvent(QMouseEvent *event) | ||
{ | ||||
if(m_rubberBand && m_rubberBand->isEnabled() && event->button() == Qt::LeftButton) { | ||||
int margin = m_chart->margin(); | ||||
QRect rect(margin, margin, width() - 2 * margin, height() - 2 * margin); | ||||
if (rect.contains(event->pos())) { | ||||
m_rubberBandOrigin = event->pos(); | ||||
m_rubberBand->setGeometry(QRect(m_rubberBandOrigin, QSize())); | ||||
m_rubberBand->show(); | ||||
event->accept(); | ||||
} | ||||
} | ||||
Marek Rosa
|
r285 | else { | ||
QGraphicsView::mousePressEvent(event); | ||||
} | ||||
Michal Klocek
|
r136 | } | ||
Marek Rosa
|
r287 | /*! | ||
If RubberBand rectange specification has been initiated in pressEvent then \a event data is used to update RubberBand geometry. | ||||
In other case the defualt QGraphicsView::mouseMoveEvent implementation is called. | ||||
*/ | ||||
Michal Klocek
|
r136 | void QChartView::mouseMoveEvent(QMouseEvent *event) | ||
{ | ||||
Michal Klocek
|
r176 | if(m_rubberBand && m_rubberBand->isVisible()) { | ||
Michal Klocek
|
r136 | int margin = m_chart->margin(); | ||
QRect rect(margin, margin, width() - 2 * margin, height() - 2 * margin); | ||||
int width = event->pos().x() - m_rubberBandOrigin.x(); | ||||
int height = event->pos().y() - m_rubberBandOrigin.y(); | ||||
if(!m_verticalRubberBand) { | ||||
m_rubberBandOrigin.setY(rect.top()); | ||||
height = rect.height(); | ||||
} | ||||
if(!m_horizonalRubberBand) { | ||||
m_rubberBandOrigin.setX(rect.left()); | ||||
width= rect.width(); | ||||
} | ||||
m_rubberBand->setGeometry(QRect(m_rubberBandOrigin.x(),m_rubberBandOrigin.y(), width,height).normalized()); | ||||
Michal Klocek
|
r176 | } | ||
else { | ||||
Michal Klocek
|
r136 | QGraphicsView::mouseMoveEvent(event); | ||
} | ||||
} | ||||
Marek Rosa
|
r285 | /*! | ||
If left mouse button is release and RubberBand is enabled then \a event is accepted and the view is zoomed in to rect specified by RubberBand | ||||
If it is the right mouse button \a event then RubberBand is dissmissed and zoom is canceled. | ||||
*/ | ||||
Michal Klocek
|
r136 | void QChartView::mouseReleaseEvent(QMouseEvent *event) | ||
{ | ||||
Michal Klocek
|
r176 | if(m_rubberBand) { | ||
if (event->button() == Qt::LeftButton && m_rubberBand->isVisible()) { | ||||
m_rubberBand->hide(); | ||||
QRect rect = m_rubberBand->geometry(); | ||||
Michal Klocek
|
r223 | m_chart->zoomIn(rect); | ||
Michal Klocek
|
r176 | event->accept(); | ||
} | ||||
Michal Klocek
|
r136 | |||
Michal Klocek
|
r176 | if(event->button()==Qt::RightButton) | ||
Michal Klocek
|
r136 | m_chart->zoomReset(); | ||
Michal Klocek
|
r176 | } | ||
else { | ||||
Michal Klocek
|
r136 | QGraphicsView::mouseReleaseEvent(event); | ||
} | ||||
} | ||||
Marek Rosa
|
r287 | /*! | ||
Pressing + and - keys performs zoomIn() and zoomOut() respectivly. | ||||
In other \a event is passed to the QGraphicsView::keyPressEvent() implementation | ||||
*/ | ||||
Michal Klocek
|
r136 | void QChartView::keyPressEvent(QKeyEvent *event) | ||
{ | ||||
switch (event->key()) { | ||||
Michal Klocek
|
r176 | case Qt::Key_Plus: | ||
Michal Klocek
|
r136 | zoomIn(); | ||
break; | ||||
Michal Klocek
|
r176 | case Qt::Key_Minus: | ||
Michal Klocek
|
r136 | zoomOut(); | ||
break; | ||||
Michal Klocek
|
r176 | default: | ||
Michal Klocek
|
r136 | QGraphicsView::keyPressEvent(event); | ||
break; | ||||
} | ||||
} | ||||
Marek Rosa
|
r277 | /*! | ||
Sets the \a theme used by the chart for rendering the graphical representation of the data | ||||
\sa QChart::ChartTheme, chartTheme() | ||||
*/ | ||||
Michal Klocek
|
r153 | void QChartView::setChartTheme(QChart::ChartTheme theme) | ||
Michal Klocek
|
r136 | { | ||
Michal Klocek
|
r153 | m_chart->setChartTheme(theme); | ||
Michal Klocek
|
r136 | } | ||
Marek Rosa
|
r277 | /*! | ||
Returns the theme enum used by the chart. | ||||
\sa setChartTheme() | ||||
*/ | ||||
Michal Klocek
|
r153 | QChart::ChartTheme QChartView::chartTheme() const | ||
{ | ||||
return m_chart->chartTheme(); | ||||
} | ||||
Michal Klocek
|
r136 | |||
Marek Rosa
|
r274 | /*! | ||
Returns the pointer to the x axis object of the chart | ||||
*/ | ||||
Michal Klocek
|
r223 | QChartAxis* QChartView::axisX() const | ||
Michal Klocek
|
r155 | { | ||
Michal Klocek
|
r223 | return m_chart->axisX(); | ||
Michal Klocek
|
r155 | } | ||
Marek Rosa
|
r274 | /*! | ||
Returns the pointer to the y axis object of the chart | ||||
*/ | ||||
Michal Klocek
|
r223 | QChartAxis* QChartView::axisY() const | ||
Michal Klocek
|
r155 | { | ||
Michal Klocek
|
r223 | return m_chart->axisY(); | ||
Michal Klocek
|
r155 | } | ||
Michal Klocek
|
r298 | /*! | ||
Tero Ahola
|
r302 | Sets animation \a options for the chart | ||
Michal Klocek
|
r298 | */ | ||
void QChartView::setAnimationOptions(QChart::AnimationOptions options) | ||||
{ | ||||
m_chart->setAnimationOptions(options); | ||||
} | ||||
/*! | ||||
Returns animation options for the chart | ||||
*/ | ||||
QChart::AnimationOptions QChartView::animationOptions() const | ||||
{ | ||||
return m_chart->animationOptions(); | ||||
} | ||||
Michal Klocek
|
r58 | QTCOMMERCIALCHART_END_NAMESPACE | ||