widget.cpp
128 lines
| 3.9 KiB
| text/x-c
|
CppLexer
Jani Honkonen
|
r1916 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 Digia Plc | ||||
** All rights reserved. | ||||
** For any questions to Digia, please use contact form at http://qt.digia.com | ||||
** | ||||
** This file is part of the Qt Commercial Charts Add-on. | ||||
** | ||||
** $QT_BEGIN_LICENSE$ | ||||
** Licensees holding valid Qt Commercial licenses may use this file in | ||||
** accordance with the Qt Commercial License Agreement provided with the | ||||
** Software or, alternatively, in accordance with the terms contained in | ||||
** a written agreement between you and Digia. | ||||
** | ||||
** If you have questions regarding the use of this file, please use | ||||
** contact form at http://qt.digia.com | ||||
** $QT_END_LICENSE$ | ||||
** | ||||
****************************************************************************/ | ||||
Marek Rosa
|
r1693 | #include "widget.h" | ||
#include <QChartView> | ||||
Marek Rosa
|
r1838 | #include <QChart> | ||
#include <QLegend> | ||||
Marek Rosa
|
r1693 | #include <QPieSeries> | ||
#include <QPieSlice> | ||||
#include <QTime> | ||||
#include <QGridLayout> | ||||
#include <QTimer> | ||||
QTCOMMERCIALCHART_USE_NAMESPACE | ||||
Widget::Widget(QWidget *parent) | ||||
: QWidget(parent) | ||||
{ | ||||
setMinimumSize(800, 600); | ||||
qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); | ||||
Marek Rosa
|
r1713 | //! [1] | ||
Marek Rosa
|
r1693 | QChartView *chartView = new QChartView; | ||
chartView->setRenderHint(QPainter::Antialiasing); | ||||
Marek Rosa
|
r1985 | QChart *chart = chartView->chart(); | ||
Marek Rosa
|
r1838 | chart->legend()->setVisible(false); | ||
Jani Honkonen
|
r1877 | chart->setTitle("Nested donuts demo"); | ||
Marek Rosa
|
r1985 | chart->setAnimationOptions(QChart::AllAnimations); | ||
Marek Rosa
|
r1713 | //! [1] | ||
Marek Rosa
|
r1693 | |||
Marek Rosa
|
r1713 | //! [2] | ||
Marek Rosa
|
r1697 | qreal minSize = 0.1; | ||
qreal maxSize = 0.9; | ||||
Marek Rosa
|
r1838 | int donutCount = 5; | ||
Marek Rosa
|
r1713 | //! [2] | ||
//! [3] | ||||
Marek Rosa
|
r1838 | for (int i = 0; i < donutCount; i++) { | ||
Marek Rosa
|
r1693 | QPieSeries *donut = new QPieSeries; | ||
Marek Rosa
|
r1697 | int sliceCount = 3 + qrand() % 3; | ||
for (int j = 0; j < sliceCount; j++) { | ||||
Marek Rosa
|
r1693 | qreal value = 100 + qrand() % 100; | ||
Marek Rosa
|
r1697 | QPieSlice *slice = new QPieSlice(QString("%1").arg(value), value); | ||
Marek Rosa
|
r1713 | slice->setLabelVisible(true); | ||
slice->setLabelColor(Qt::white); | ||||
slice->setLabelPosition(QPieSlice::LabelInsideTangential); | ||||
Marek Rosa
|
r1697 | connect(slice, SIGNAL(hovered(bool)), this, SLOT(explodeSlice(bool))); | ||
donut->append(slice); | ||||
Marek Rosa
|
r1838 | donut->setHoleSize(minSize + i * (maxSize - minSize) / donutCount); | ||
donut->setPieSize(minSize + (i + 1) * (maxSize - minSize) / donutCount); | ||||
Marek Rosa
|
r1693 | } | ||
Marek Rosa
|
r1697 | m_donuts.append(donut); | ||
Marek Rosa
|
r1693 | chartView->chart()->addSeries(donut); | ||
} | ||||
Marek Rosa
|
r1713 | //! [3] | ||
Marek Rosa
|
r1693 | |||
// create main layout | ||||
Marek Rosa
|
r1713 | //! [4] | ||
Marek Rosa
|
r1693 | QGridLayout* mainLayout = new QGridLayout; | ||
mainLayout->addWidget(chartView, 1, 1); | ||||
setLayout(mainLayout); | ||||
Marek Rosa
|
r1713 | //! [4] | ||
Marek Rosa
|
r1693 | |||
Marek Rosa
|
r1713 | //! [5] | ||
Marek Rosa
|
r1697 | updateTimer = new QTimer(this); | ||
Marek Rosa
|
r1693 | connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateRotation())); | ||
Marek Rosa
|
r1713 | updateTimer->start(1250); | ||
//! [5] | ||||
Marek Rosa
|
r1693 | } | ||
Widget::~Widget() | ||||
{ | ||||
} | ||||
Marek Rosa
|
r1713 | //! [6] | ||
Marek Rosa
|
r1693 | void Widget::updateRotation() | ||
{ | ||||
Marek Rosa
|
r1697 | for (int i = 0; i < m_donuts.count(); i++) { | ||
QPieSeries *donut = m_donuts.at(i); | ||||
Marek Rosa
|
r1693 | qreal phaseShift = -50 + qrand() % 100; | ||
donut->setPieStartAngle(donut->pieStartAngle() + phaseShift); | ||||
donut->setPieEndAngle(donut->pieEndAngle() + phaseShift); | ||||
} | ||||
} | ||||
Marek Rosa
|
r1713 | //! [6] | ||
Marek Rosa
|
r1697 | |||
Marek Rosa
|
r1713 | //! [7] | ||
Marek Rosa
|
r1697 | void Widget::explodeSlice(bool exploded) | ||
{ | ||||
QPieSlice *slice = qobject_cast<QPieSlice *>(sender()); | ||||
if (exploded) { | ||||
updateTimer->stop(); | ||||
qreal sliceStartAngle = slice->startAngle(); | ||||
qreal sliceEndAngle = slice->startAngle() + slice->angleSpan(); | ||||
QPieSeries *donut = slice->series(); | ||||
qreal seriesIndex = m_donuts.indexOf(donut); | ||||
for (int i = seriesIndex + 1; i < m_donuts.count(); i++) { | ||||
m_donuts.at(i)->setPieStartAngle(sliceEndAngle); | ||||
m_donuts.at(i)->setPieEndAngle(360 + sliceStartAngle); | ||||
} | ||||
} else { | ||||
for (int i = 0; i < m_donuts.count(); i++) { | ||||
m_donuts.at(i)->setPieStartAngle(0); | ||||
m_donuts.at(i)->setPieEndAngle(360); | ||||
} | ||||
updateTimer->start(); | ||||
} | ||||
slice->setExploded(exploded); | ||||
} | ||||
Marek Rosa
|
r1713 | //! [7] | ||