##// END OF EJS Templates
Add QML designer plugin...
Add QML designer plugin Added QML designer plugin for Charts. It's possible now to add all possible series in ChartView and PolarChartView type. The properties of ChartView and PolarChartView can be set via the QML designer. The properties of the series are not editable via the QML designer. Change-Id: I51cd6bf5bd33cd8d0f7b7f2fb992e7963e344dae Task-number: QTRD-3356 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>

File last commit:

r2733:c6ed50e68438
r2738:6c4e7f2cd60f
Show More
tst_qpieslice.cpp
341 lines | 10.7 KiB | text/x-c | CppLexer
/****************************************************************************
**
** Copyright (C) 2014 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 Enterprise Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Enterprise licenses may use this file in
** accordance with the Qt Enterprise 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$
**
****************************************************************************/
#include <QtTest/QtTest>
#include <tst_definitions.h>
#include <QtCharts/QChartView>
#include <QtCharts/QChart>
#include <QtCharts/QPieSlice>
#include <QtCharts/QPieSeries>
QT_CHARTS_USE_NAMESPACE
class tst_qpieslice : public QObject
{
Q_OBJECT
public slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
private slots:
void construction();
void changedSignals();
void customize();
void clickedSignal();
void hoverSignal();
private:
QList<QPoint> slicePoints(QRectF rect);
private:
};
void tst_qpieslice::initTestCase()
{
}
void tst_qpieslice::cleanupTestCase()
{
QTest::qWait(1); // Allow final deleteLaters to run
}
void tst_qpieslice::init()
{
}
void tst_qpieslice::cleanup()
{
}
void tst_qpieslice::construction()
{
// no params
QPieSlice slice1;
QCOMPARE(slice1.value(), 0.0);
QVERIFY(slice1.label().isEmpty());
QVERIFY(!slice1.isLabelVisible());
QVERIFY(!slice1.isExploded());
QCOMPARE(slice1.pen(), QPen());
QCOMPARE(slice1.brush(), QBrush());
QCOMPARE(slice1.labelBrush(), QBrush());
QCOMPARE(slice1.labelFont(), QFont());
QCOMPARE(slice1.labelArmLengthFactor(), 0.15); // default value
QCOMPARE(slice1.explodeDistanceFactor(), 0.15); // default value
QCOMPARE(slice1.percentage(), 0.0);
QCOMPARE(slice1.startAngle(), 0.0);
QCOMPARE(slice1.angleSpan(), 0.0);
// value and label params
QPieSlice slice2("foobar", 1.0);
QCOMPARE(slice2.value(), 1.0);
QCOMPARE(slice2.label(), QString("foobar"));
QVERIFY(!slice2.isLabelVisible());
QVERIFY(!slice2.isExploded());
QCOMPARE(slice2.pen(), QPen());
QCOMPARE(slice2.brush(), QBrush());
QCOMPARE(slice2.labelBrush(), QBrush());
QCOMPARE(slice2.labelFont(), QFont());
QCOMPARE(slice2.labelArmLengthFactor(), 0.15); // default value
QCOMPARE(slice2.explodeDistanceFactor(), 0.15); // default value
QCOMPARE(slice2.percentage(), 0.0);
QCOMPARE(slice2.startAngle(), 0.0);
QCOMPARE(slice2.angleSpan(), 0.0);
}
void tst_qpieslice::changedSignals()
{
QPieSlice slice;
QSignalSpy valueSpy(&slice, SIGNAL(valueChanged()));
QSignalSpy labelSpy(&slice, SIGNAL(labelChanged()));
QSignalSpy penSpy(&slice, SIGNAL(penChanged()));
QSignalSpy brushSpy(&slice, SIGNAL(brushChanged()));
QSignalSpy labelBrushSpy(&slice, SIGNAL(labelBrushChanged()));
QSignalSpy labelFontSpy(&slice, SIGNAL(labelFontChanged()));
QSignalSpy colorSpy(&slice, SIGNAL(colorChanged()));
QSignalSpy borderColorSpy(&slice, SIGNAL(borderColorChanged()));
QSignalSpy borderWidthSpy(&slice, SIGNAL(borderWidthChanged()));
QSignalSpy labelColorSpy(&slice, SIGNAL(labelColorChanged()));
// percentageChanged(), startAngleChanged() and angleSpanChanged() signals tested at tst_qpieseries::calculatedValues()
// set everything twice to see we do not get unnecessary signals
slice.setValue(1.0);
slice.setValue(-1.0);
QCOMPARE(slice.value(), 1.0);
slice.setLabel("foobar");
slice.setLabel("foobar");
slice.setLabelVisible();
slice.setLabelVisible();
slice.setExploded();
slice.setExploded();
slice.setPen(QPen(Qt::red));
slice.setPen(QPen(QBrush(Qt::red), 3));
slice.setBrush(QBrush(Qt::red));
slice.setBrush(QBrush(Qt::red));
slice.setLabelBrush(QBrush(Qt::green));
slice.setLabelBrush(QBrush(Qt::green));
slice.setLabelFont(QFont("Tahoma"));
slice.setLabelFont(QFont("Tahoma"));
slice.setLabelPosition(QPieSlice::LabelInsideHorizontal);
slice.setLabelPosition(QPieSlice::LabelInsideHorizontal);
slice.setLabelArmLengthFactor(0.1);
slice.setLabelArmLengthFactor(0.1);
slice.setExplodeDistanceFactor(0.1);
slice.setExplodeDistanceFactor(0.1);
TRY_COMPARE(valueSpy.count(), 1);
TRY_COMPARE(labelSpy.count(), 1);
TRY_COMPARE(penSpy.count(), 2);
TRY_COMPARE(brushSpy.count(), 1);
TRY_COMPARE(labelBrushSpy.count(), 1);
TRY_COMPARE(labelFontSpy.count(), 1);
TRY_COMPARE(colorSpy.count(), 1);
TRY_COMPARE(borderColorSpy.count(), 1);
TRY_COMPARE(borderWidthSpy.count(), 1);
TRY_COMPARE(labelColorSpy.count(), 1);
}
void tst_qpieslice::customize()
{
// create a pie series
QPieSeries *series = new QPieSeries();
QPieSlice *s1 = series->append("slice 1", 1);
QPieSlice *s2 = series->append("slice 2", 2);
series->append("slice 3", 3);
// customize a slice
QPen p1(Qt::red);
s1->setPen(p1);
QBrush b1(Qt::red);
s1->setBrush(b1);
s1->setLabelBrush(b1);
QFont f1("Consolas");
s1->setLabelFont(f1);
// add series to the chart
QChartView view(new QChart());
view.resize(200, 200);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
//QTest::qWait(1000);
// check that customizations persist
QCOMPARE(s1->pen(), p1);
QCOMPARE(s1->brush(), b1);
QCOMPARE(s1->labelBrush(), b1);
QCOMPARE(s1->labelFont(), f1);
// remove a slice
series->remove(s2);
QCOMPARE(s1->pen(), p1);
QCOMPARE(s1->brush(), b1);
QCOMPARE(s1->labelBrush(), b1);
QCOMPARE(s1->labelFont(), f1);
// add a slice
series->append("slice 4", 4);
QCOMPARE(s1->pen(), p1);
QCOMPARE(s1->brush(), b1);
QCOMPARE(s1->labelBrush(), b1);
QCOMPARE(s1->labelFont(), f1);
// insert a slice
series->insert(0, new QPieSlice("slice 5", 5));
QCOMPARE(s1->pen(), p1);
QCOMPARE(s1->brush(), b1);
QCOMPARE(s1->labelBrush(), b1);
QCOMPARE(s1->labelFont(), f1);
// change theme
// theme will overwrite customizations
view.chart()->setTheme(QChart::ChartThemeHighContrast);
QVERIFY(s1->pen() != p1);
QVERIFY(s1->brush() != b1);
QVERIFY(s1->labelBrush() != b1);
QVERIFY(s1->labelFont() != f1);
}
void tst_qpieslice::clickedSignal()
{
// NOTE:
// This test is the same as tst_qpieseries::clickedSignal()
// Just for different signals.
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
// create a pie series
QPieSeries *series = new QPieSeries();
QPieSlice *s1 = series->append("slice 1", 1);
QPieSlice *s2 = series->append("slice 2", 1);
QPieSlice *s3 = series->append("slice 3", 1);
QPieSlice *s4 = series->append("slice 4", 1);
QSignalSpy clickSpy1(s1, SIGNAL(clicked()));
QSignalSpy clickSpy2(s2, SIGNAL(clicked()));
QSignalSpy clickSpy3(s3, SIGNAL(clicked()));
QSignalSpy clickSpy4(s4, SIGNAL(clicked()));
// add series to the chart
QChartView view;
view.chart()->legend()->setVisible(false);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
// simulate clicks
series->setPieSize(1.0);
QRectF pieRect = view.chart()->plotArea();
QList<QPoint> points = slicePoints(pieRect);
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, points.at(0));
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, points.at(1));
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, points.at(2));
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, points.at(3));
QCOMPARE(clickSpy1.count(), 1);
QCOMPARE(clickSpy2.count(), 1);
QCOMPARE(clickSpy3.count(), 1);
QCOMPARE(clickSpy4.count(), 1);
}
void tst_qpieslice::hoverSignal()
{
// NOTE:
// This test is the same as tst_qpieseries::hoverSignal()
// Just for different signals.
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
// add some slices
QPieSeries *series = new QPieSeries();
QPieSlice *s1 = series->append("slice 1", 1);
QPieSlice *s2 = series->append("slice 2", 1);
QPieSlice *s3 = series->append("slice 3", 1);
QPieSlice *s4 = series->append("slice 4", 1);
// add series to the chart
QChartView view;
view.chart()->legend()->setVisible(false);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
// try to ensure focus
QApplication::setActiveWindow(&view);
view.setFocus();
QApplication::processEvents();
QVERIFY(view.isActiveWindow());
QVERIFY(view.hasFocus());
// move inside the slices
series->setPieSize(1.0);
QRectF pieRect = view.chart()->plotArea();
QList<QPoint> points = slicePoints(pieRect);
QTest::mouseMove(view.viewport(), pieRect.topRight().toPoint(), 100);
QSignalSpy hoverSpy1(s1, SIGNAL(hovered(bool)));
QSignalSpy hoverSpy2(s2, SIGNAL(hovered(bool)));
QSignalSpy hoverSpy3(s3, SIGNAL(hovered(bool)));
QSignalSpy hoverSpy4(s4, SIGNAL(hovered(bool)));
QTest::mouseMove(view.viewport(), points.at(0), 100);
QTest::mouseMove(view.viewport(), points.at(1), 100);
QTest::mouseMove(view.viewport(), points.at(2), 100);
QTest::mouseMove(view.viewport(), points.at(3), 100);
QTest::mouseMove(view.viewport(), pieRect.topLeft().toPoint(), 100);
// Final hoverevent can take few milliseconds to appear in some environments, so wait a bit
QTest::qWait(100);
// check
QCOMPARE(hoverSpy1.count(), 2);
QCOMPARE(qvariant_cast<bool>(hoverSpy1.at(0).at(0)), true);
QCOMPARE(qvariant_cast<bool>(hoverSpy1.at(1).at(0)), false);
QCOMPARE(hoverSpy2.count(), 2);
QCOMPARE(qvariant_cast<bool>(hoverSpy2.at(0).at(0)), true);
QCOMPARE(qvariant_cast<bool>(hoverSpy2.at(1).at(0)), false);
QCOMPARE(hoverSpy3.count(), 2);
QCOMPARE(qvariant_cast<bool>(hoverSpy3.at(0).at(0)), true);
QCOMPARE(qvariant_cast<bool>(hoverSpy3.at(1).at(0)), false);
QCOMPARE(hoverSpy4.count(), 2);
QCOMPARE(qvariant_cast<bool>(hoverSpy4.at(0).at(0)), true);
QCOMPARE(qvariant_cast<bool>(hoverSpy4.at(1).at(0)), false);
}
QList<QPoint> tst_qpieslice::slicePoints(QRectF rect)
{
qreal x1 = rect.topLeft().x() + (rect.width() / 4);
qreal x2 = rect.topLeft().x() + (rect.width() / 4) * 3;
qreal y1 = rect.topLeft().y() + (rect.height() / 4);
qreal y2 = rect.topLeft().y() + (rect.height() / 4) * 3;
QList<QPoint> points;
points << QPoint(x2, y1);
points << QPoint(x2, y2);
points << QPoint(x1, y2);
points << QPoint(x1, y1);
return points;
}
QTEST_MAIN(tst_qpieslice)
#include "tst_qpieslice.moc"