view.cpp
121 lines
| 4.0 KiB
| text/x-c
|
CppLexer
Marek Rosa
|
r2346 | /**************************************************************************** | ||
** | ||||
Titta Heikkala
|
r2688 | ** Copyright (C) 2014 Digia Plc | ||
Marek Rosa
|
r2346 | ** All rights reserved. | ||
Titta Heikkala
|
r2740 | ** For any questions to Digia, please use contact form at http://qt.io | ||
Marek Rosa
|
r2346 | ** | ||
Titta Heikkala
|
r2740 | ** This file is part of the Qt Charts module. | ||
Marek Rosa
|
r2346 | ** | ||
Titta Heikkala
|
r2740 | ** Licensees holding valid commercial license for Qt may use this file in | ||
** accordance with the Qt License Agreement provided with the Software | ||||
** or, alternatively, in accordance with the terms contained in a written | ||||
** agreement between you and Digia. | ||||
Marek Rosa
|
r2346 | ** | ||
** If you have questions regarding the use of this file, please use | ||||
Titta Heikkala
|
r2740 | ** contact form at http://qt.io | ||
Marek Rosa
|
r2346 | ** | ||
****************************************************************************/ | ||||
#include "view.h" | ||||
Titta Heikkala
|
r2714 | #include <QtGui/QResizeEvent> | ||
#include <QtWidgets/QGraphicsScene> | ||||
#include <QtCharts/QChart> | ||||
#include <QtCharts/QLineSeries> | ||||
#include <QtCharts/QSplineSeries> | ||||
#include <QtWidgets/QGraphicsTextItem> | ||||
Marek Rosa
|
r2346 | #include "callout.h" | ||
Titta Heikkala
|
r2714 | #include <QtGui/QMouseEvent> | ||
Marek Rosa
|
r2346 | |||
View::View(QWidget *parent) | ||||
: QGraphicsView(new QGraphicsScene, parent), | ||||
m_coordX(0), | ||||
m_coordY(0), | ||||
m_chart(0), | ||||
m_tooltip(0) | ||||
{ | ||||
setDragMode(QGraphicsView::NoDrag); | ||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | ||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | ||||
// chart | ||||
m_chart = new QChart; | ||||
Marek Rosa
|
r2351 | m_chart->setMinimumSize(640, 480); | ||
Marek Rosa
|
r2346 | m_chart->setTitle("Hover the line to show callout. Click the line to make it stay"); | ||
m_chart->legend()->hide(); | ||||
QLineSeries *series = new QLineSeries; | ||||
series->append(1, 3); | ||||
series->append(4, 5); | ||||
series->append(5, 4.5); | ||||
series->append(7, 1); | ||||
series->append(11, 2); | ||||
m_chart->addSeries(series); | ||||
QSplineSeries *series2 = new QSplineSeries; | ||||
series2->append(1.6, 1.4); | ||||
series2->append(2.4, 3.5); | ||||
series2->append(3.7, 2.5); | ||||
series2->append(7, 4); | ||||
series2->append(10, 2); | ||||
m_chart->addSeries(series2); | ||||
m_chart->createDefaultAxes(); | ||||
m_chart->setAcceptHoverEvents(true); | ||||
setRenderHint(QPainter::Antialiasing); | ||||
scene()->addItem(m_chart); | ||||
m_coordX = new QGraphicsSimpleTextItem(m_chart); | ||||
m_coordX->setPos(m_chart->size().width()/2 - 50, m_chart->size().height()); | ||||
m_coordX->setText("X: "); | ||||
m_coordY = new QGraphicsSimpleTextItem(m_chart); | ||||
m_coordY->setPos(m_chart->size().width()/2 + 50, m_chart->size().height()); | ||||
m_coordY->setText("Y: "); | ||||
connect(series, SIGNAL(clicked(QPointF)), this, SLOT(keepCallout())); | ||||
connect(series, SIGNAL(hovered(QPointF, bool)), this, SLOT(tooltip(QPointF,bool))); | ||||
connect(series2, SIGNAL(clicked(QPointF)), this, SLOT(keepCallout())); | ||||
connect(series2, SIGNAL(hovered(QPointF, bool)), this, SLOT(tooltip(QPointF,bool))); | ||||
this->setMouseTracking(true); | ||||
} | ||||
void View::resizeEvent(QResizeEvent *event) | ||||
{ | ||||
Marek Rosa
|
r2351 | if (scene()) { | ||
Marek Rosa
|
r2346 | scene()->setSceneRect(QRect(QPoint(0, 0), event->size())); | ||
Marek Rosa
|
r2351 | m_chart->resize(event->size()); | ||
m_coordX->setPos(m_chart->size().width()/2 - 50, m_chart->size().height() - 20); | ||||
m_coordY->setPos(m_chart->size().width()/2 + 50, m_chart->size().height() - 20); | ||||
} | ||||
Marek Rosa
|
r2346 | QGraphicsView::resizeEvent(event); | ||
} | ||||
void View::mouseMoveEvent(QMouseEvent *event) | ||||
{ | ||||
m_coordX->setText(QString("X: %1").arg(m_chart->mapToValue(event->pos()).x())); | ||||
m_coordY->setText(QString("Y: %1").arg(m_chart->mapToValue(event->pos()).y())); | ||||
QGraphicsView::mouseMoveEvent(event); | ||||
} | ||||
void View::keepCallout() | ||||
{ | ||||
m_tooltip = new Callout(m_chart); | ||||
} | ||||
void View::tooltip(QPointF point, bool state) | ||||
{ | ||||
if (m_tooltip == 0) | ||||
m_tooltip = new Callout(m_chart); | ||||
if (state) { | ||||
m_tooltip->setText(QString("X: %1 \nY: %2 ").arg(point.x()).arg(point.y())); | ||||
QXYSeries *series = qobject_cast<QXYSeries *>(sender()); | ||||
m_tooltip->setAnchor(m_chart->mapToPosition(point, series)); | ||||
m_tooltip->setPos(m_chart->mapToPosition(point, series) + QPoint(10, -50)); | ||||
m_tooltip->setZValue(11); | ||||
m_tooltip->show(); | ||||
} else { | ||||
m_tooltip->hide(); | ||||
} | ||||
} | ||||