diff --git a/examples/examples.pro b/examples/examples.pro index df146a0..81d93d8 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -20,4 +20,4 @@ SUBDIRS += linechart \ stackedbarchartdrilldown \ customcolors \ tablemodelchart \ - ekgchart + #ekgchart diff --git a/examples/splinechart/splinewidget.cpp b/examples/splinechart/splinewidget.cpp index 353d1bb..3f92579 100644 --- a/examples/splinechart/splinewidget.cpp +++ b/examples/splinechart/splinewidget.cpp @@ -5,6 +5,7 @@ #include #include "qchartaxis.h" #include +#include QTCOMMERCIALCHART_USE_NAMESPACE @@ -12,6 +13,7 @@ SplineWidget::SplineWidget(QWidget *parent) : QWidget(parent) { // qsrand(time(NULL)); + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //! [1] //create QSplineSeries series = new QSplineSeries(this); diff --git a/examples/tablemodelchart/customtablemodel.cpp b/examples/tablemodelchart/customtablemodel.cpp index bb05ef6..7c71b37 100644 --- a/examples/tablemodelchart/customtablemodel.cpp +++ b/examples/tablemodelchart/customtablemodel.cpp @@ -1,32 +1,48 @@ #include "customtablemodel.h" +#include CustomTableModel::CustomTableModel(QObject *parent) : QAbstractTableModel(parent) { - m_points.append(QPointF(10, 50)); - m_labels.append("Apples"); - m_points.append(QPointF(60, 70)); - m_labels.append("Oranges"); - m_points.append(QPointF(110, 50)); - m_labels.append("Bananas"); - m_points.append(QPointF(140, 40)); - m_labels.append("Lemons"); - m_points.append(QPointF(200, 150)); - m_labels.append("Plums"); - m_points.append(QPointF(225, 75)); - m_labels.append("Pearls"); +// m_points.append(QPointF(10, 50)); +// m_labels.append("Apples"); +// m_points.append(QPointF(60, 70)); +// m_labels.append("Oranges"); +// m_points.append(QPointF(110, 50)); +// m_labels.append("Bananas"); +// m_points.append(QPointF(140, 40)); +// m_labels.append("Lemons"); +// m_points.append(QPointF(200, 150)); +// m_labels.append("Plums"); +// m_points.append(QPointF(225, 75)); + // m_labels.append("Pearls"); + + // m_data + for (int i = 0; i < 6; i++) + { + QVector* dataVec = new QVector(6); + for (int k = 0; k < dataVec->size(); k++) + if (k%2 == 0) + dataVec->replace(k, i * 50 + qrand()%20); + else + dataVec->replace(k, qrand()%100); + m_data.append(dataVec); + m_labels.append(QString("Row: %1").arg((i + 1))); + } } int CustomTableModel::rowCount(const QModelIndex & parent) const { Q_UNUSED(parent) - return m_points.count(); + // return m_points.count(); + return m_data.count(); } int CustomTableModel::columnCount(const QModelIndex & parent) const { Q_UNUSED(parent) - return 3; + // return 3; + return 6; } QVariant CustomTableModel::headerData (int section, Qt::Orientation orientation, int role ) const @@ -38,14 +54,19 @@ QVariant CustomTableModel::headerData (int section, Qt::Orientation orientation, { switch(section) { - case 0: - return "x"; - case 1: - return "y"; - case 2: + // case 0: + // return "x"; + // case 1: + // return "y"; + // case 2: + case 6: return "Fruit"; default: - return "What?"; + if (section%2 == 0) + return "x"; + else + return "y"; + // return "What?"; } } else @@ -58,13 +79,15 @@ QVariant CustomTableModel::data(const QModelIndex & index, int role) const { switch(index.column()) { - case 0: - return m_points[index.row()].x(); - case 1: - return m_points[index.row()].y(); - case 2: + // case 0: + // return m_points[index.row()].x(); + // case 1: + // return m_points[index.row()].y(); + // case 2: + case 6: return m_labels[index.row()]; default: + return m_data[index.row()]->at(index.column()); break; } } @@ -72,13 +95,15 @@ QVariant CustomTableModel::data(const QModelIndex & index, int role) const { switch(index.column()) { - case 0: - return m_points[index.row()].x(); - case 1: - return m_points[index.row()].y(); - case 2: + // case 0: + // return m_points[index.row()].x(); + // case 1: + // return m_points[index.row()].y(); + // case 2: + case 6: return m_labels[index.row()]; default: + return m_data[index.row()]->at(index.column()); break; } } @@ -91,17 +116,20 @@ bool CustomTableModel::setData ( const QModelIndex & index, const QVariant & val { switch(index.column()) { - case 0: - m_points[index.row()].setX(value.toDouble()); - break; - case 1: - m_points[index.row()].setY(value.toDouble()); - break; - case 2: + // case 0: + // m_points[index.row()].setX(value.toDouble()); + // break; + // case 1: + // m_points[index.row()].setY(value.toDouble()); + // break; + // case 2: + case 6: m_labels.replace(index.row(), value.toString()); break; default: - return false; + m_data[index.row()]->replace(index.column(), value.toDouble()); + break; + // return false; } emit dataChanged(index, index); return true; @@ -111,9 +139,9 @@ bool CustomTableModel::setData ( const QModelIndex & index, const QVariant & val Qt::ItemFlags CustomTableModel::flags ( const QModelIndex & index ) const { -// if (!index.isValid()) -// return Qt::ItemIsEnabled; - return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; + // if (!index.isValid()) + // return Qt::ItemIsEnabled; + return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } bool CustomTableModel::insertRows ( int row, int count, const QModelIndex & parent) @@ -125,8 +153,30 @@ bool CustomTableModel::insertRows ( int row, int count, const QModelIndex & pare beginInsertRows(QModelIndex(), row /*dataTable.count()*/, row + count - 1); for (int i = row; i < row + count; i++) { - m_points.insert(row, QPointF(10,20)); - m_labels.insert(row,("a")); + // m_points.insert(row, QPointF(10,20)); + QVector* dataVec = new QVector(6); + for (int k = 0; k < dataVec->size(); k++) + if (k%2 == 0) + // dataVec->replace(k, i * 50 + qrand()%20); + { + int difference = 0; + if (row < m_data.size()) + { + if (row - 1 >= 0) + { + difference = (int)(qAbs(m_data[row]->at(k) - m_data[row - 1]->at(k))); + dataVec->replace(k, m_data[row - 1]->at(k) + qrand()%qMax(1, difference)); + } + else + dataVec->replace(k, qrand()%20); + } + else + dataVec->replace(k, m_data[row - 1]->at(k) + qrand()%20); + } + else + dataVec->replace(k, qrand()%100); + m_data.insert(row, dataVec); + m_labels.insert(row,(QString("Row: %1").arg(row + 1))); } endInsertRows(); return true; @@ -143,7 +193,10 @@ bool CustomTableModel::removeRows ( int row, int count, const QModelIndex & pare beginRemoveRows(parent, row, row + count - 1); for (int i = row; i < row + count; i++) { - m_points.removeAt(row); +// m_points.removeAt(row); + QVector* item = m_data.at(row); + m_data.removeAt(row); + delete item; m_labels.removeAt(row); } endRemoveRows(); diff --git a/examples/tablemodelchart/customtablemodel.h b/examples/tablemodelchart/customtablemodel.h index 09aa591..abf449e 100644 --- a/examples/tablemodelchart/customtablemodel.h +++ b/examples/tablemodelchart/customtablemodel.h @@ -24,6 +24,7 @@ public: //public slots: private: + QList* > m_data; QList m_points; QStringList m_labels; diff --git a/examples/tablemodelchart/tablewidget.cpp b/examples/tablemodelchart/tablewidget.cpp index 6b7ace5..4b12fb8 100644 --- a/examples/tablemodelchart/tablewidget.cpp +++ b/examples/tablemodelchart/tablewidget.cpp @@ -7,21 +7,27 @@ #include "qscatterseries.h" #include "customtablemodel.h" #include "qpieseries.h" +#include "qareaseries.h" +#include "qbarseries.h" #include #include +#include TableWidget::TableWidget(QWidget *parent) : QWidget(parent) { setGeometry(100, 100, 1000, 600); + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); // create simple model for storing data // user's table data model m_model = new CustomTableModel; tableView = new QTableView; tableView->setModel(m_model); - tableView->setMinimumSize(340, 480); + tableView->setMinimumHeight(240); +// tableView->setMinimumSize(340, 480); // tableView->setItemDelegate(new QStyledItemDelegate); chartView = new QChartView(this); + chartView->setRenderHint(QPainter::Antialiasing); chartView->setMinimumSize(640, 480); // create @@ -59,27 +65,35 @@ TableWidget::TableWidget(QWidget *parent) splineRadioButton = new QRadioButton("Spline"); scatterRadioButton = new QRadioButton("Scatter"); pieRadioButton = new QRadioButton("Pie"); + areaRadioButton = new QRadioButton("Area"); + barRadioButton = new QRadioButton("Bar"); connect(lineRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType())); connect(splineRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType())); connect(scatterRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType())); connect(pieRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType())); + connect(areaRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType())); + connect(barRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType())); lineRadioButton->setChecked(true); // radio buttons layout - QHBoxLayout* radioLayout = new QHBoxLayout; + QVBoxLayout* radioLayout = new QVBoxLayout; radioLayout->addWidget(lineRadioButton); radioLayout->addWidget(splineRadioButton); radioLayout->addWidget(scatterRadioButton); radioLayout->addWidget(pieRadioButton); + radioLayout->addWidget(areaRadioButton); + radioLayout->addWidget(barRadioButton); + radioLayout->addStretch(); // create main layout QGridLayout* mainLayout = new QGridLayout; - mainLayout->addLayout(buttonsLayout, 0, 1); - mainLayout->addLayout(radioLayout, 0, 2); + mainLayout->addLayout(buttonsLayout, 1, 0); + mainLayout->addLayout(radioLayout, 2, 0); mainLayout->addWidget(tableView, 1, 1); - mainLayout->addWidget(chartView, 1, 2); + mainLayout->addWidget(chartView, 2, 1); setLayout(mainLayout); + lineRadioButton->setFocus(); } void TableWidget::addRowAbove() @@ -107,24 +121,126 @@ void TableWidget::updateChartType() chartView->removeAllSeries(); if (lineRadioButton->isChecked()) + { + // series 1 + series = new QLineSeries; + series->setModel(m_model); + series->setModelMapping(0,1, Qt::Vertical); +// series->setModelMapping(0,1, Qt::Horizontal); + chartView->addSeries(series); + + // series 2 + series = new QLineSeries; + series->setModel(m_model); + series->setModelMapping(2,3, Qt::Vertical); +// series->setModelMapping(2,3, Qt::Horizontal); + chartView->addSeries(series); + + // series 3 series = new QLineSeries; + series->setModel(m_model); + series->setModelMapping(4,5, Qt::Vertical); +// series->setModelMapping(4,5, Qt::Horizontal); + chartView->addSeries(series); + } else if (splineRadioButton->isChecked()) + { + // series 1 + series = new QSplineSeries; + series->setModel(m_model); + series->setModelMapping(0,1, Qt::Vertical); +// series->setModelMapping(0,1, Qt::Horizontal); + chartView->addSeries(series); + + // series 2 series = new QSplineSeries; + series->setModel(m_model); + series->setModelMapping(2,3, Qt::Vertical); +// series->setModelMapping(2,3, Qt::Horizontal); + chartView->addSeries(series); + + // series 3 + series = new QSplineSeries; + series->setModel(m_model); + series->setModelMapping(4,5, Qt::Vertical); +// series->setModelMapping(4,5, Qt::Horizontal); + chartView->addSeries(series); + } else if (scatterRadioButton->isChecked()) + { + // series 1 + series = new QScatterSeries; + series->setModel(m_model); + series->setModelMapping(0,1, Qt::Vertical); +// series->setModelMapping(0,1, Qt::Horizontal); + chartView->addSeries(series); + + // series 2 + series = new QScatterSeries; + series->setModel(m_model); + series->setModelMapping(2,3, Qt::Vertical); +// series->setModelMapping(2,3, Qt::Horizontal); + chartView->addSeries(series); + + // series 3 series = new QScatterSeries; + series->setModel(m_model); + series->setModelMapping(4,5, Qt::Vertical); +// series->setModelMapping(4,5, Qt::Horizontal); + chartView->addSeries(series); + } else if (pieRadioButton->isChecked()) { + // pie 1 QPieSeries* pieSeries = new QPieSeries; pieSeries->setModel(m_model); - pieSeries->setModelMapping(0,2, Qt::Vertical); + pieSeries->setModelMapping(0,0, Qt::Horizontal); + pieSeries->setLabelsVisible(true); + pieSeries->setPieSize(0.4); + pieSeries->setPiePosition(0.2, 0.35); + chartView->addSeries(pieSeries); + + // pie 2 + pieSeries = new QPieSeries; + pieSeries->setModel(m_model); + pieSeries->setModelMapping(1,1, Qt::Horizontal); + pieSeries->setLabelsVisible(true); + pieSeries->setPieSize(0.4); + pieSeries->setPiePosition(0.8, 0.35); + chartView->addSeries(pieSeries); + + // pie 3 + pieSeries = new QPieSeries; + pieSeries->setModel(m_model); + pieSeries->setModelMapping(2,2, Qt::Horizontal); pieSeries->setLabelsVisible(true); + pieSeries->setPieSize(0.4); + pieSeries->setPiePosition(0.5, 0.65); chartView->addSeries(pieSeries); - return; + } + else if (areaRadioButton->isChecked()) + { + QLineSeries* upperLineSeries = new QLineSeries; + upperLineSeries->setModel(m_model); + upperLineSeries->setModelMapping(0, 1, Qt::Vertical); + QLineSeries* lowerLineSeries = new QLineSeries; + lowerLineSeries->setModel(m_model); + lowerLineSeries->setModelMapping(2, 3, Qt::Vertical); + QAreaSeries* areaSeries = new QAreaSeries(upperLineSeries, lowerLineSeries); + chartView->addSeries(areaSeries); + } + else if (barRadioButton->isChecked()) + { + QBarSeries* barSeries = new QBarSeries(QStringList()); + barSeries->setModel(m_model); + barSeries->setModelMapping(5, 2, 4, Qt::Vertical); + barSeries->setToolTipEnabled(true); + chartView->addSeries(barSeries); } - series->setModel(m_model); - series->setModelMapping(0,1, Qt::Vertical); - chartView->addSeries(series); +// series->setModel(m_model); +// series->setModelMapping(0,1, Qt::Vertical); +// chartView->addSeries(series); } TableWidget::~TableWidget() diff --git a/examples/tablemodelchart/tablewidget.h b/examples/tablemodelchart/tablewidget.h index 5421e0b..707b69a 100644 --- a/examples/tablemodelchart/tablewidget.h +++ b/examples/tablemodelchart/tablewidget.h @@ -36,6 +36,8 @@ public: QRadioButton* splineRadioButton; QRadioButton* scatterRadioButton; QRadioButton* pieRadioButton; + QRadioButton* areaRadioButton; + QRadioButton* barRadioButton; }; #endif // TABLEWIDGET_H diff --git a/src/areachart/qareaseries.cpp b/src/areachart/qareaseries.cpp index fcceebb..1717d9f 100644 --- a/src/areachart/qareaseries.cpp +++ b/src/areachart/qareaseries.cpp @@ -124,6 +124,25 @@ void QAreaSeries::setPointsVisible(bool visible) } } +//bool QAreaSeries::setModel(QAbstractItemModel* model) +//{ +// m_upperSeries->setModel(model); +// if (m_lowerSeries) +// m_lowerSeries->setModel(model); +// return true; +//} + +//void QAreaSeries::setModelMappingUpper(int modelX, int modelY, Qt::Orientation orientation) +//{ +// m_upperSeries->setModelMapping(modelX, modelY, orientation); +//} + +//void QAreaSeries::setModelMappingLower(int modelX, int modelY, Qt::Orientation orientation) +//{ +// if (m_lowerSeries) +// m_lowerSeries->setModelMapping(modelX, modelY, orientation); +//} + #include "moc_qareaseries.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/areachart/qareaseries.h b/src/areachart/qareaseries.h index 16a023a..3eb7c42 100644 --- a/src/areachart/qareaseries.h +++ b/src/areachart/qareaseries.h @@ -32,6 +32,10 @@ public: // from QChartSeries void setPointsVisible(bool visible); bool pointsVisible() const {return m_pointsVisible;} +// bool setModel(QAbstractItemModel* model); +// void setModelMappingUpper(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical); +// void setModelMappingLower(int modelX, int modelY, Qt::Orientation orientation = Qt::Vertical); + signals: void updated(); void clicked(const QPointF& point); diff --git a/src/barchart/qbarseries.cpp b/src/barchart/qbarseries.cpp index a624401..9106d68 100644 --- a/src/barchart/qbarseries.cpp +++ b/src/barchart/qbarseries.cpp @@ -41,6 +41,7 @@ QBarSeries::QBarSeries(QStringList categories, QObject *parent) m_mapCategories = -1; m_mapBarBottom = -1; m_mapBarTop = -1; + m_mapOrientation = Qt::Vertical; } /*! @@ -53,6 +54,7 @@ void QBarSeries::addBarSet(QBarSet *set) mModel->addBarSet(set); connect(set,SIGNAL(clicked(QString)),this,SLOT(barsetClicked(QString))); connect(set,SIGNAL(rightClicked(QString)),this,SLOT(barsetRightClicked(QString))); + connect(set, SIGNAL(changed()), this, SLOT(barsetChanged())); } /*! @@ -72,9 +74,9 @@ void QBarSeries::removeBarSet(QBarSet *set) */ int QBarSeries::barsetCount() { - if(m_model) - return m_mapBarTop - m_mapBarBottom; - else +// if(m_model) +// return m_mapBarTop - m_mapBarBottom; +// else return mModel->barsetCount(); } @@ -223,18 +225,121 @@ bool QBarSeries::separatorsVisible() bool QBarSeries::setModel(QAbstractItemModel* model) { - m_model = model; - return true; + // disconnect signals from old model + if(m_model) + { + disconnect(m_model, 0, this, 0); + m_mapCategories = -1; + m_mapBarBottom = -1; + m_mapBarTop = -1; + m_mapOrientation = Qt::Vertical; + } + + // set new model + if(model) + { + m_model = model; + return true; + } + else + { + m_model = NULL; + return false; + } } // TODO -void QBarSeries::setModelMappingCategories(int /*modelColumn*/) +void QBarSeries::setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation) { + if (m_model == NULL) + return; + m_mapCategories = categories; + m_mapBarBottom = bottomBoundry; + m_mapBarTop = topBoundry; + m_mapOrientation = orientation; + + // connect the signals + if (m_mapOrientation == Qt::Vertical) + { + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } + else + { + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } + + + // create the initial bars + delete mModel; + if (m_mapOrientation == Qt::Vertical) + { + QStringList categories; + for (int k = 0; k < m_model->columnCount(); k++) + categories << m_model->data(m_model->index(m_mapCategories, k), Qt::DisplayRole).toString(); + mModel = new BarChartModel(categories, this); + + for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) + { + QBarSet* barSet = new QBarSet(QString("Row: %1").arg(i + 1)); + for(int m = 0; m < m_model->columnCount(); m++) + *barSet << m_model->data(m_model->index(i, m), Qt::DisplayRole).toDouble(); + addBarSet(barSet); + } + } + else + { + QStringList categories; + for (int k = 0; k < m_model->rowCount(); k++) + categories << m_model->data(m_model->index(k, m_mapCategories), Qt::DisplayRole).toString(); + mModel = new BarChartModel(categories, this); + + for (int i = m_mapBarBottom; i <= m_mapBarTop; i++) + { + QBarSet* barSet = new QBarSet(QString("Column: %1").arg(i + 1)); + for(int m = 0; m < m_model->rowCount(); m++) + *barSet << m_model->data(m_model->index(m, i), Qt::DisplayRole).toDouble(); + addBarSet(barSet); + } + } } -// TODO -void QBarSeries::setModelMappingBarRange(int /*bottomBoundry*/, int /*topBoundry*/) +void QBarSeries::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) +{ + Q_UNUSED(bottomRight) + + if (m_mapOrientation == Qt::Vertical) + { + if (topLeft.column() >= m_mapBarBottom && topLeft.column() <= m_mapBarTop) + barsetAt(topLeft.row())->setValue(topLeft.column(), m_model->data(topLeft, Qt::DisplayRole).toDouble()); +// else if (topLeft.column() == m_mapCategories) +// slices().at(topLeft.row())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); + } + else + { + if (topLeft.row() >= m_mapBarBottom && topLeft.row() <= m_mapBarTop) + barsetAt(topLeft.column())->setValue(topLeft.row(), m_model->data(topLeft, Qt::DisplayRole).toDouble()); +// else if (topLeft.row() == m_mapCategories) +// slices().at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); + } +} + +void QBarSeries::modelDataAdded(QModelIndex /*parent*/, int /*start*/, int /*end*/) +{ + // +} + +void QBarSeries::modelDataRemoved(QModelIndex /*parent*/, int /*start*/, int /*end*/) +{ + // +} + +void QBarSeries::barsetChanged() { +// mModel-> } #include "moc_qbarseries.cpp" diff --git a/src/barchart/qbarseries.h b/src/barchart/qbarseries.h index 7998561..782a552 100644 --- a/src/barchart/qbarseries.h +++ b/src/barchart/qbarseries.h @@ -27,8 +27,7 @@ public: bool setModel(QAbstractItemModel* model); QAbstractItemModel* modelExt() {return m_model;} - void setModelMappingCategories(int modelColumn); - void setModelMappingBarRange(int bottomBoundry, int topBoundry); + void setModelMapping(int categories, int bottomBoundry, int topBoundry, Qt::Orientation orientation = Qt::Vertical); public: // TODO: Functions below this are not part of api and will be moved @@ -66,6 +65,13 @@ public Q_SLOTS: void barsetRightClicked(QString category); // <--- TO PIMPL +private Q_SLOTS: + // slots for updating bars when data in model changes + void modelUpdated(QModelIndex topLeft, QModelIndex bottomRight); + void modelDataAdded(QModelIndex parent, int start, int end); + void modelDataRemoved(QModelIndex parent, int start, int end); + void barsetChanged(); + protected: BarChartModel* mModel; bool mSeparatorsVisible; @@ -74,6 +80,7 @@ protected: int m_mapCategories; int m_mapBarBottom; int m_mapBarTop; + Qt::Orientation m_mapOrientation; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/barchart/qbarset.cpp b/src/barchart/qbarset.cpp index ad5d86e..fa088c9 100644 --- a/src/barchart/qbarset.cpp +++ b/src/barchart/qbarset.cpp @@ -107,6 +107,7 @@ qreal QBarSet::valueAt(int index) void QBarSet::setValue(int index, qreal value) { mValues.replace(index,value); + emit changed(); } /*! diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index 6f69802..4738419 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -481,32 +481,48 @@ bool QPieSeries::setModel(QAbstractItemModel* model) // disconnect signals from old model if(m_model) { - disconnect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), 0, 0); - disconnect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), 0, 0); - disconnect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), 0, 0); + disconnect(m_model, 0, this, 0); + m_mapValues = -1; + m_mapLabels = -1; + m_mapOrientation = Qt::Vertical; } - // set new model if not NULL and connect necessary signals from it + // set new model if(model) { m_model = model; - connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + return true; + } + else + { + m_model = NULL; + return false; } - - return true; } void QPieSeries::setModelMapping(int modelValuesLine, int modelLabelsLine, Qt::Orientation orientation) { + if (m_model == NULL) + return; m_mapValues = modelValuesLine; m_mapLabels = modelLabelsLine; m_mapOrientation = orientation; - if (m_model == NULL) - return; + // connect the signals + if (m_mapOrientation == Qt::Vertical) + { + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } + else + { + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } + // create the initial slices set if (m_mapOrientation == Qt::Vertical) for (int i = 0; i < m_model->rowCount(); i++) add(m_model->data(m_model->index(i, m_mapValues), Qt::DisplayRole).toDouble(), m_model->data(m_model->index(i, m_mapLabels), Qt::DisplayRole).toString()); @@ -532,9 +548,9 @@ void QPieSeries::modelUpdated(QModelIndex topLeft, QModelIndex bottomRight) else { // slices().at(topLeft.column())->setValue(m_model->data(m_model->index(topLeft.row(), topLeft.column()), Qt::DisplayRole).toDouble()); - if (topLeft.column() == m_mapValues) + if (topLeft.row() == m_mapValues) slices().at(topLeft.column())->setValue(m_model->data(topLeft, Qt::DisplayRole).toDouble()); - else if (topLeft.column() == m_mapLabels) + else if (topLeft.row() == m_mapLabels) slices().at(topLeft.column())->setLabel(m_model->data(topLeft, Qt::DisplayRole).toString()); } } diff --git a/src/xychart/qxyseries.cpp b/src/xychart/qxyseries.cpp index ae68508..cd07c52 100644 --- a/src/xychart/qxyseries.cpp +++ b/src/xychart/qxyseries.cpp @@ -53,7 +53,7 @@ QXYSeries::QXYSeries(QObject* parent):QSeries(parent) m_mapX = -1; m_mapY = -1; m_mapOrientation = Qt::Vertical; -// m_mapYOrientation = Qt::Vertical; + // m_mapYOrientation = Qt::Vertical; } /*! Destroys the object. Series added to QChartView or QChart instances are owned by those, @@ -306,20 +306,48 @@ void QXYSeries::modelDataRemoved(QModelIndex parent, int start, int end) } bool QXYSeries::setModel(QAbstractItemModel* model) { - m_model = model; - // for (int i = 0; i < m_model->rowCount(); i++) - // emit pointAdded(i); - connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); - connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); - connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); - return true; + + // disconnect signals from old model + if(m_model) + { + disconnect(m_model, 0, this, 0); + m_mapX = -1; + m_mapY = -1; + m_mapOrientation = Qt::Vertical; + } + + // set new model + if(model) + { + m_model = model; + return true; + } + else + { + m_model = NULL; + return false; + } } void QXYSeries::setModelMapping(int modelX, int modelY, Qt::Orientation orientation) { + if (m_model == NULL) + return; m_mapX = modelX; m_mapY = modelY; m_mapOrientation = orientation; + if (m_mapOrientation == Qt::Vertical) + { + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } + else + { + connect(m_model,SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(modelUpdated(QModelIndex, QModelIndex))); + connect(m_model,SIGNAL(columnsInserted(QModelIndex, int, int)), this, SLOT(modelDataAdded(QModelIndex,int,int))); + connect(m_model, SIGNAL(columnsRemoved(QModelIndex, int, int)), this, SLOT(modelDataRemoved(QModelIndex,int,int))); + } } //void QXYSeries::setModelMappingY(int modelLineIndex, Qt::Orientation orientation)