|
|
#include "qchartview.h"
|
|
|
#include "qchart.h"
|
|
|
#include "qchartaxis.h"
|
|
|
#include <QGraphicsView>
|
|
|
#include <QGraphicsScene>
|
|
|
#include <QRubberBand>
|
|
|
#include <QResizeEvent>
|
|
|
#include <QDebug>
|
|
|
|
|
|
/*!
|
|
|
\class QChartView
|
|
|
\brief Chart widget
|
|
|
|
|
|
QChartView is a standalone widget that can display charts. It does not require 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.
|
|
|
|
|
|
\sa QChart
|
|
|
*/
|
|
|
|
|
|
QTCOMMERCIALCHART_BEGIN_NAMESPACE
|
|
|
|
|
|
QChartView::QChartView(QWidget *parent) :
|
|
|
QGraphicsView(parent),
|
|
|
m_scene(new QGraphicsScene(this)),
|
|
|
m_chart(new QChart()),
|
|
|
m_rubberBand(0),
|
|
|
m_verticalRubberBand(false),
|
|
|
m_horizonalRubberBand(false)
|
|
|
{
|
|
|
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
setScene(m_scene);
|
|
|
m_chart->setMargin(50);
|
|
|
m_scene->addItem(m_chart);
|
|
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Destroys the object and it's children, like QChartSeries and QChartAxis object added to it.
|
|
|
*/
|
|
|
QChartView::~QChartView()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
void QChartView::resizeEvent(QResizeEvent *event)
|
|
|
{
|
|
|
m_scene->setSceneRect(0,0,size().width(),size().height());
|
|
|
m_chart->resize(size());
|
|
|
QWidget::resizeEvent(event);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Adds the series and optional y axis onto the chart and takes the ownership of the objects.
|
|
|
If auto scaling is enabled, re-scales the axes the series is bound to (both the x axis and
|
|
|
the y axis).
|
|
|
\sa removeSeries, removeAllSeries
|
|
|
*/
|
|
|
void QChartView::addSeries(QChartSeries* series,QChartAxis *axisY)
|
|
|
{
|
|
|
m_chart->addSeries(series,axisY);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Removes the QChartSeries specified in a perameter from the QChartView.
|
|
|
It releses its ownership of the specified QChartSeries object.
|
|
|
It does not delete the pointed QChartSeries data object
|
|
|
\sa removeSeries(), removeAllSeries()
|
|
|
*/
|
|
|
void QChartView::removeSeries(QChartSeries* series)
|
|
|
{
|
|
|
m_chart->removeSeries(series);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Removes all the QChartSeries that have been added to the QChartView
|
|
|
It also deletes the pointed QChartSeries data objects
|
|
|
\sa addSeries(), removeSeries()
|
|
|
*/
|
|
|
void QChartView::removeAllSeries()
|
|
|
{
|
|
|
m_chart->removeAllSeries();
|
|
|
}
|
|
|
|
|
|
void QChartView::zoomIn()
|
|
|
{
|
|
|
m_chart->zoomIn();
|
|
|
}
|
|
|
|
|
|
void QChartView::zoomIn(const QRect& rect)
|
|
|
{
|
|
|
m_chart->zoomIn(rect);
|
|
|
}
|
|
|
|
|
|
void QChartView::zoomOut()
|
|
|
{
|
|
|
m_chart->zoomOut();
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
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.
|
|
|
*/
|
|
|
int QChartView::margin() const
|
|
|
{
|
|
|
return m_chart->margin();
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Sets the chart \a tile. A description text that is rendered above the chart.
|
|
|
*/
|
|
|
void QChartView::setChartTitle(const QString& title)
|
|
|
{
|
|
|
m_chart->setChartTitle(title);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Sets the \a font that is used for rendering the description text that is rendered above the chart.
|
|
|
*/
|
|
|
void QChartView::setChartTitleFont(const QFont& font)
|
|
|
{
|
|
|
m_chart->setChartTitleFont(font);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Sets the \a brush that is used for painting the background of the chart area of the QChartView widget.
|
|
|
*/
|
|
|
void QChartView::setChartBackgroundBrush(const QBrush& brush)
|
|
|
{
|
|
|
m_chart->setChartBackgroundBrush(brush);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Sets the \a pen that is used for painting the background of the chart area of the QChartView widget.
|
|
|
*/
|
|
|
void QChartView::setChartBackgroundPen(const QPen& pen)
|
|
|
{
|
|
|
m_chart->setChartBackgroundPen(pen);
|
|
|
}
|
|
|
|
|
|
void QChartView::setRubberBandPolicy(const RubberBandPolicy policy)
|
|
|
{
|
|
|
switch(policy) {
|
|
|
case VerticalRubberBand:
|
|
|
m_verticalRubberBand = true;
|
|
|
m_horizonalRubberBand = false;
|
|
|
break;
|
|
|
case HorizonalRubberBand:
|
|
|
m_verticalRubberBand = false;
|
|
|
m_horizonalRubberBand = true;
|
|
|
break;
|
|
|
case RectangleRubberBand:
|
|
|
m_verticalRubberBand = true;
|
|
|
m_horizonalRubberBand = true;
|
|
|
break;
|
|
|
case NoRubberBand:
|
|
|
default:
|
|
|
delete m_rubberBand;
|
|
|
m_rubberBand=0;
|
|
|
m_horizonalRubberBand = false;
|
|
|
m_verticalRubberBand = false;
|
|
|
return;
|
|
|
}
|
|
|
if(!m_rubberBand) {
|
|
|
m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
|
|
|
m_rubberBand->setEnabled(true);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
QChartView::RubberBandPolicy QChartView::rubberBandPolicy() const
|
|
|
{
|
|
|
if(m_horizonalRubberBand && m_verticalRubberBand) return RectangleRubberBand;
|
|
|
if(m_horizonalRubberBand) return HorizonalRubberBand;
|
|
|
if(m_verticalRubberBand) return VerticalRubberBand;
|
|
|
return NoRubberBand;
|
|
|
}
|
|
|
|
|
|
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();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void QChartView::mouseMoveEvent(QMouseEvent *event)
|
|
|
{
|
|
|
if(m_rubberBand && m_rubberBand->isVisible()) {
|
|
|
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());
|
|
|
}
|
|
|
else {
|
|
|
QGraphicsView::mouseMoveEvent(event);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void QChartView::mouseReleaseEvent(QMouseEvent *event)
|
|
|
{
|
|
|
if(m_rubberBand) {
|
|
|
if (event->button() == Qt::LeftButton && m_rubberBand->isVisible()) {
|
|
|
m_rubberBand->hide();
|
|
|
QRect rect = m_rubberBand->geometry();
|
|
|
m_chart->zoomIn(rect);
|
|
|
event->accept();
|
|
|
}
|
|
|
|
|
|
if(event->button()==Qt::RightButton)
|
|
|
m_chart->zoomReset();
|
|
|
}
|
|
|
else {
|
|
|
QGraphicsView::mouseReleaseEvent(event);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void QChartView::keyPressEvent(QKeyEvent *event)
|
|
|
{
|
|
|
switch (event->key()) {
|
|
|
case Qt::Key_Plus:
|
|
|
zoomIn();
|
|
|
break;
|
|
|
case Qt::Key_Minus:
|
|
|
zoomOut();
|
|
|
break;
|
|
|
default:
|
|
|
QGraphicsView::keyPressEvent(event);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Sets the \a theme used by the chart for rendering the graphical representation of the data
|
|
|
\sa QChart::ChartTheme, chartTheme()
|
|
|
*/
|
|
|
void QChartView::setChartTheme(QChart::ChartTheme theme)
|
|
|
{
|
|
|
m_chart->setChartTheme(theme);
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Returns the theme enum used by the chart.
|
|
|
\sa setChartTheme()
|
|
|
*/
|
|
|
QChart::ChartTheme QChartView::chartTheme() const
|
|
|
{
|
|
|
return m_chart->chartTheme();
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Returns the pointer to the x axis object of the chart
|
|
|
*/
|
|
|
QChartAxis* QChartView::axisX() const
|
|
|
{
|
|
|
return m_chart->axisX();
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
Returns the pointer to the y axis object of the chart
|
|
|
*/
|
|
|
QChartAxis* QChartView::axisY() const
|
|
|
{
|
|
|
return m_chart->axisY();
|
|
|
}
|
|
|
|
|
|
QTCOMMERCIALCHART_END_NAMESPACE
|
|
|
|