view.cpp
132 lines
| 4.6 KiB
| text/x-c
|
CppLexer
|
r2854 | /**************************************************************************** | ||
|
r2845 | ** | ||
|
r2854 | ** Copyright (C) 2016 The Qt Company Ltd. | ||
** Contact: https://www.qt.io/licensing/ | ||||
|
r2845 | ** | ||
|
r2854 | ** This file is part of the Qt Charts module of the Qt Toolkit. | ||
|
r2845 | ** | ||
|
r2854 | ** $QT_BEGIN_LICENSE:GPL$ | ||
|
r2845 | ** Commercial License Usage | ||
** Licensees holding valid commercial Qt licenses may use this file in | ||||
** accordance with the commercial license agreement provided with the | ||||
** Software or, alternatively, in accordance with the terms contained in | ||||
** a written agreement between you and The Qt Company. For licensing terms | ||||
|
r2854 | ** and conditions see https://www.qt.io/terms-conditions. For further | ||
** information use the contact form at https://www.qt.io/contact-us. | ||||
** | ||||
** GNU General Public License Usage | ||||
** Alternatively, this file may be used under the terms of the GNU | ||||
** General Public License version 3 or (at your option) any later version | ||||
** approved by the KDE Free Qt Foundation. The licenses are as published by | ||||
** the Free Software Foundation and appearing in the file LICENSE.GPL3 | ||||
** included in the packaging of this file. Please review the following | ||||
** information to ensure the GNU General Public License requirements will | ||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html. | ||||
|
r2845 | ** | ||
** $QT_END_LICENSE$ | ||||
** | ||||
|
r2854 | ****************************************************************************/ | ||
|
r2346 | |||
#include "view.h" | ||||
|
r2714 | #include <QtGui/QResizeEvent> | ||
#include <QtWidgets/QGraphicsScene> | ||||
#include <QtCharts/QChart> | ||||
#include <QtCharts/QLineSeries> | ||||
#include <QtCharts/QSplineSeries> | ||||
#include <QtWidgets/QGraphicsTextItem> | ||||
|
r2346 | #include "callout.h" | ||
|
r2714 | #include <QtGui/QMouseEvent> | ||
|
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; | ||||
|
r2351 | m_chart->setMinimumSize(640, 480); | ||
|
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) | ||||
{ | ||||
|
r2351 | if (scene()) { | ||
|
r2346 | scene()->setSceneRect(QRect(QPoint(0, 0), event->size())); | ||
|
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); | ||||
} | ||||
|
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(); | ||||
} | ||||
} | ||||