summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-07-11 15:42:17 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-07-12 07:46:44 +0300
commitb7880ecf270935702dea8d7aaab1dfbef648ff5b (patch)
treed39e59b73668e626f8914cee7dc19d4d75c8d4c6 /examples
parentde429a77448f8c4a6acb2f95f626db20c835e184 (diff)
Modified barchart example to use QTableWidget for data.
Also implemented asynchronous resolving of data in model in response to signals so that every item change doesn't cause full resolve when the model is being populated. Change-Id: I3b6aee7421901f9624b9e17b91df36c569cf36d8 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/barchart/barchart.pro2
-rw-r--r--examples/barchart/main.cpp133
2 files changed, 63 insertions, 72 deletions
diff --git a/examples/barchart/barchart.pro b/examples/barchart/barchart.pro
index 668b5195..12b296c5 100644
--- a/examples/barchart/barchart.pro
+++ b/examples/barchart/barchart.pro
@@ -5,3 +5,5 @@
SOURCES += main.cpp
INSTALLS += target
+
+QT += widgets
diff --git a/examples/barchart/main.cpp b/examples/barchart/main.cpp
index 03c8b5db..827fdcf4 100644
--- a/examples/barchart/main.cpp
+++ b/examples/barchart/main.cpp
@@ -41,9 +41,11 @@
#include "q3dbars.h"
#include "qdataset.h"
#include "qcategoryaxis.h"
-#include "qolddataproxy.h"
+#include "qitemmodelbardataproxy.h"
-#include <QGuiApplication>
+#include <QApplication>
+#include <QVBoxLayout>
+#include <QTableWidget>
#include <QScreen>
#include <QTimer>
#include <QFont>
@@ -59,11 +61,11 @@ using namespace QtDataVis3D;
class ChartDataGenerator : public QObject
{
public:
- explicit ChartDataGenerator(Q3DBars *barchart);
+ explicit ChartDataGenerator(Q3DBars *barchart, QTableWidget *tableWidget);
~ChartDataGenerator();
- void addDataSet();
- void addBars();
+ void setupModel();
+ void addRow();
void changeStyle();
void changePresetCamera();
void changeTheme();
@@ -77,16 +79,18 @@ private:
QTimer *m_themeTimer;
int m_columnCount;
int m_rowCount;
+ QTableWidget *m_tableWidget; // not owned
};
-ChartDataGenerator::ChartDataGenerator(Q3DBars *barchart)
+ChartDataGenerator::ChartDataGenerator(Q3DBars *barchart, QTableWidget *tableWidget)
: m_chart(barchart),
m_dataTimer(0),
m_styleTimer(0),
m_presetTimer(0),
m_themeTimer(0),
- m_columnCount(21),
- m_rowCount(21)
+ m_columnCount(100),
+ m_rowCount(50),
+ m_tableWidget(tableWidget)
{
// Set up bar specifications; make the bars as wide as they are deep,
// and add a small space between the bars
@@ -95,6 +99,7 @@ ChartDataGenerator::ChartDataGenerator(Q3DBars *barchart)
#ifndef USE_STATIC_DATA
// Set up sample space; make it as deep as it's wide
m_chart->setupSampleSpace(m_rowCount, m_columnCount);
+ m_tableWidget->setColumnCount(m_columnCount);
#endif
// Set bar type to smooth bar
@@ -148,11 +153,11 @@ void ChartDataGenerator::start()
#ifndef USE_STATIC_DATA
m_dataTimer = new QTimer();
m_dataTimer->setTimerType(Qt::CoarseTimer);
- m_dataTimer->setInterval(100);
- QObject::connect(m_dataTimer, &QTimer::timeout, this, &ChartDataGenerator::addBars);
- m_dataTimer->start(100);
+ m_dataTimer->setInterval(20);
+ QObject::connect(m_dataTimer, &QTimer::timeout, this, &ChartDataGenerator::addRow);
+ m_dataTimer->start(20);
#else
- addDataSet();
+ setupModel();
#endif
#ifdef CYCLE_THROUGH_STYLES
@@ -184,33 +189,8 @@ void ChartDataGenerator::start()
#endif
}
-void ChartDataGenerator::addDataSet()
+void ChartDataGenerator::setupModel()
{
-#if 0
- // Prepare data to be visualized
- // Use float vector adder
- QVector< QVector<float> > data;
- QVector<float> row;
- // TODO: Keep here for testing
- for (int j = 0; j < m_rowCount; j++) {
- for (int i = 0; i < m_columnCount; i++) {
- row.prepend(((float)i / (float)m_columnCount) * 100 + (float)(rand() % 30));
- //row.append(1.0f);
- }
- data.append(row);
- row.clear();
- }
- // Set up sample space based on inserted data
- m_chart->setupSampleSpace(m_rowCount, m_columnCount);
- // Add data to chart
- m_chart->addDataSet(data);
-#else
- // Prepare data to be visualized
- // Use QDataSet adder
-
- // Set window title
- m_chart->setWindowTitle(QStringLiteral("Hours playing banjo"));
-
// Set up row and column names
QStringList days;
days << "Monday" << "Tuesday" << "Wednesday" << "Thursday" << "Friday" << "Saturday" << "Sunday";
@@ -221,15 +201,12 @@ void ChartDataGenerator::addDataSet()
float hours[5][7] = {{2.0f, 1.0f, 3.0f, 0.2f, 1.0f, 5.0f, 7.0f}, // week 1
{0.5f, 1.0f, 3.0f, 1.0f, 2.0f, 2.0f, 3.0f}, // week 2
{1.0f, 1.0f, 2.0f, 1.0f, 4.0f, 4.0f, 4.0f}, // week 3
- {0.0f, 0.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4
+ {0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4
{3.0f, 3.0f, 6.0f, 2.0f, 2.0f, 1.0f, 1.0f}}; // week 5
// Set tick count and step, we want a line every hour -> 7 ticks, step 1 hour
m_chart->setTickCount(7, 1.0f);
- // Create data set
- QDataSet *dataSet = new QDataSet();
-
// Add labels
m_chart->rowAxis()->setTitle("Week of year");
m_chart->columnAxis()->setTitle("Day of week");
@@ -237,37 +214,30 @@ void ChartDataGenerator::addDataSet()
m_chart->rowAxis()->setLabels(weeks);
m_chart->columnAxis()->setLabels(days);
- // Create data rows
- QDataRow *dataRow;
+ m_tableWidget->setRowCount(5);
+ m_tableWidget->setColumnCount(7);
+ m_tableWidget->setHorizontalHeaderLabels(days);
+ m_tableWidget->setVerticalHeaderLabels(weeks);
+
for (int week = 0; week < weeks.size(); week++) {
- dataRow = new QDataRow();
- // Create data items
for (int day = 0; day < days.size(); day++) {
- // Add data to rows
- dataRow->addItem(new QDataItem(hours[week][day], "h"));//, " + days.at(day)));
+ QModelIndex index = m_tableWidget->model()->index(week, day);
+ m_tableWidget->model()->setData(index, hours[week][day]);
}
- // Add row to set
- dataSet->addRow(dataRow);
- // Get next pointer
- dataRow++;
}
// Set up sample space based on prepared data
m_chart->setupSampleSpace(weeks.size(), days.size());
-
- // Add data to chart
- // TODO QDataSet reverses the data in rows and columns when you add it, so results are now mirrored.
- qWarning() << "Example broken! QDataSet mirrors data, rows and columns will not be correct!";
- static_cast<QOldDataProxy *>(m_chart->dataProxy())->addDataSet(dataSet);
-#endif
}
-void ChartDataGenerator::addBars()
+void ChartDataGenerator::addRow()
{
- QVector<float> data;
- for (int i = 0; i < m_columnCount; i++)
- data.append(((float)i / (float)m_columnCount) / 2.0f + (float)(rand() % 30) / 100);
- static_cast<QOldDataProxy *>(m_chart->dataProxy())->addDataRow(data);
+ m_tableWidget->model()->insertRow(0);
+ for (int i = 0; i < m_columnCount; i++) {
+ QModelIndex index = m_tableWidget->model()->index(0, i);
+ m_tableWidget->model()->setData(index,
+ ((qreal)i / (qreal)m_columnCount) / 2.0 + (qreal)(rand() % 30) / 100.0);
+ }
}
void ChartDataGenerator::changeStyle()
@@ -326,18 +296,37 @@ void ChartDataGenerator::changeTheme()
int main(int argc, char **argv)
{
- QGuiApplication app(argc, argv);
+ QApplication app(argc, argv);
+
+ QWidget *widget = new QWidget;
+ QVBoxLayout *layout = new QVBoxLayout(widget);
+
+ Q3DBars *chart = new Q3DBars();
+ QSize screenSize = chart->screen()->size();
+
+ QWidget *container = QWidget::createWindowContainer(chart);
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
- Q3DBars barchart;
- QOldDataProxy *proxy = new QOldDataProxy;
- barchart.setDataProxy(proxy);
- QSize screenSize = barchart.screen()->size();
- barchart.resize(screenSize.width() / 1.5, screenSize.height() / 1.5);
- barchart.setPosition(screenSize.width() / 6, screenSize.height() / 6);
- barchart.show();
+ widget->setWindowTitle(QStringLiteral("Hours playing banjo"));
- ChartDataGenerator *generator = new ChartDataGenerator(&barchart);
+ QTableWidget *tableWidget = new QTableWidget(0, 0, widget);
+
+ layout->addWidget(tableWidget);
+ layout->addWidget(container, 1);
+
+ // We don't need to initialize the mapping object in any way, as it defaults
+ // to row/column support and uses the Qt::DisplayRole role for value role by default.
+ QItemModelBarDataMapping mapping;
+ QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(tableWidget->model(), &mapping);
+ chart->setDataProxy(proxy);
+
+ ChartDataGenerator *generator = new ChartDataGenerator(chart, tableWidget);
generator->start();
+ widget->show();
+
return app.exec();
}