summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/data/qitemmodelscatterdataproxy.cpp')
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy.cpp144
1 files changed, 108 insertions, 36 deletions
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
index 5536a105..471033e8 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
@@ -29,11 +29,21 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
* \since Qt Data Visualization 1.0
*
* QItemModelScatterDataProxy allows you to use QAbstractItemModel derived models as a data source
- * for Q3DScatter. It maps roles defined in QItemModelScatterDataMapping to roles in the model.
+ * for Q3DScatter. It maps roles of QAbstractItemModel to the XYZ-values of Q3DScatter points.
*
* The data is resolved asynchronously whenever the mapping or the model changes.
* QScatterDataProxy::arrayReset() is emitted when the data has been resolved.
*
+ * Mapping ignores rows and columns of the QAbstractItemModel and treats
+ * all items equally. It requires the model to provide at least three roles for the data items
+ * that can be mapped to X, Y, and Z-values for the scatter points.
+ *
+ * For example, assume that you have a custom QAbstractItemModel for storing various measurements
+ * done on material samples, providing data for roles such as "density", "hardness", and
+ * "conductivity". You could visualize these properties on a scatter graph using this proxy:
+ *
+ * \snippet doc_src_qtdatavisualization.cpp 4
+ *
* \sa {Qt Data Visualization Data Handling}
*/
@@ -51,11 +61,13 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
* The data is resolved asynchronously whenever the mapping or the model changes.
* QScatterDataProxy::arrayReset() is emitted when the data has been resolved.
*
+ * For more details, see QItemModelScatterDataProxy documentation.
+ *
* Usage example:
*
* \snippet doc_src_qmldatavisualization.cpp 8
*
- * \sa ScatterDataProxy, ScatterDataMapping, {Qt Data Visualization Data Handling}
+ * \sa ScatterDataProxy, {Qt Data Visualization Data Handling}
*/
/*!
@@ -64,29 +76,59 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
*/
/*!
- * \qmlproperty list ItemModelScatterDataProxy::activeMapping
- * The active mapping. Modifying a mapping that is set to the proxy will trigger data set
- * re-resolving.
+ * \qmlproperty string ItemModelScatterDataProxy::xPosRole
+ * The X position role of the mapping.
*/
/*!
- * Constructs QItemModelScatterDataProxy.
+ * \qmlproperty string ItemModelScatterDataProxy::yPosRole
+ * The Y position role of the mapping.
*/
-QItemModelScatterDataProxy::QItemModelScatterDataProxy() :
- QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this))
+
+/*!
+ * \qmlproperty string ItemModelScatterDataProxy::zPosRole
+ * The Z position role of the mapping.
+ */
+
+/*!
+ * Constructs QItemModelScatterDataProxy with optional \a parent.
+ */
+QItemModelScatterDataProxy::QItemModelScatterDataProxy(QObject *parent)
+ : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent)
{
+ connectItemModelHandler();
}
/*!
- * Constructs QItemModelScatterDataProxy with \a itemModel and \a mapping. Does not take ownership
- * of the model or the mapping, but does connect to them to listen for changes.
+ * Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
*/
QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
- QItemModelScatterDataMapping *mapping) :
- QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this))
+ QObject *parent)
+ : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent)
{
dptr()->m_itemModelHandler->setItemModel(itemModel);
- dptr()->m_itemModelHandler->setActiveMapping(mapping);
+ connectItemModelHandler();
+}
+
+/*!
+ * Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
+ * ownership of the \a itemModel, as typically item models are owned by other controls.
+ * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, and zPosRole property
+ * to \a zPosRole.
+ */
+QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
+ const QString &xPosRole,
+ const QString &yPosRole,
+ const QString &zPosRole,
+ QObject *parent)
+ : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent)
+{
+ dptr()->m_itemModelHandler->setItemModel(itemModel);
+ dptr()->m_xPosRole = xPosRole;
+ dptr()->m_yPosRole = yPosRole;
+ dptr()->m_zPosRole = zPosRole;
+ connectItemModelHandler();
}
/*!
@@ -113,50 +155,68 @@ const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const
}
/*!
- * \property QItemModelScatterDataProxy::activeMapping
+ * \property QItemModelScatterDataProxy::xPosRole
*
- * Defines the data mapping. The proxy takes ownership of the \a mapping.
- * Modifying a mapping that is set to the proxy will trigger data set re-resolving.
+ * Defines the X position role for the mapping.
*/
-void QItemModelScatterDataProxy::setActiveMapping(QItemModelScatterDataMapping *mapping)
+void QItemModelScatterDataProxy::setXPosRole(const QString &role)
{
- dptr()->m_itemModelHandler->setActiveMapping(mapping);
+ if (dptr()->m_xPosRole != role) {
+ dptr()->m_xPosRole = role;
+ emit xPosRoleChanged(role);
+ }
}
-QItemModelScatterDataMapping *QItemModelScatterDataProxy::activeMapping() const
+QString QItemModelScatterDataProxy::xPosRole() const
{
- return static_cast<QItemModelScatterDataMapping *>(dptrc()->m_itemModelHandler->activeMapping());
+ return dptrc()->m_xPosRole;
}
/*!
- * Transfers the ownership of the \a mapping to this proxy. The mapping is not taken to use yet.
- * \sa setActiveMapping(), releaseMapping()
+ * \property QItemModelScatterDataProxy::yPosRole
+ *
+ * Defines the Y position role for the mapping.
*/
-void QItemModelScatterDataProxy::addMapping(QItemModelScatterDataMapping *mapping)
+void QItemModelScatterDataProxy::setYPosRole(const QString &role)
{
- dptr()->m_itemModelHandler->addMapping(mapping);
+ if (dptr()->m_yPosRole != role) {
+ dptr()->m_yPosRole = role;
+ emit yPosRoleChanged(role);
+ }
+}
+
+QString QItemModelScatterDataProxy::yPosRole() const
+{
+ return dptrc()->m_yPosRole;
}
/*!
- * Releases the ownership of the \a mapping back to the caller. If the mapping was the currently
- * active one, no mapping remains active after this call.
+ * \property QItemModelScatterDataProxy::zPosRole
+ *
+ * Defines the Z position role for the mapping.
*/
-void QItemModelScatterDataProxy::releaseMapping(QItemModelScatterDataMapping *mapping)
+void QItemModelScatterDataProxy::setZPosRole(const QString &role)
{
- dptr()->m_itemModelHandler->releaseMapping(mapping);
+ if (dptr()->m_zPosRole != role) {
+ dptr()->m_zPosRole = role;
+ emit zPosRoleChanged(role);
+ }
+}
+
+QString QItemModelScatterDataProxy::zPosRole() const
+{
+ return dptrc()->m_zPosRole;
}
/*!
- * \return list of mappings owned by the proxy.
+ * Changes \a xPosRole, \a yPosRole and \a zPosRole mapping.
*/
-QList<QItemModelScatterDataMapping *> QItemModelScatterDataProxy::mappings() const
+void QItemModelScatterDataProxy::remap(const QString &xPosRole, const QString &yPosRole,
+ const QString &zPosRole)
{
- QList<QItemModelScatterDataMapping *> retList;
- QList<QAbstractDataMapping *> abstractList = dptrc()->m_itemModelHandler->mappings();
- foreach (QAbstractDataMapping *mapping, abstractList)
- retList.append(static_cast<QItemModelScatterDataMapping *>(mapping));
-
- return retList;
+ setXPosRole(xPosRole);
+ setYPosRole(yPosRole);
+ setZPosRole(zPosRole);
}
/*!
@@ -175,6 +235,18 @@ const QItemModelScatterDataProxyPrivate *QItemModelScatterDataProxy::dptrc() con
return static_cast<const QItemModelScatterDataProxyPrivate *>(d_ptr.data());
}
+void QItemModelScatterDataProxy::connectItemModelHandler()
+{
+ QObject::connect(dptr()->m_itemModelHandler, &ScatterItemModelHandler::itemModelChanged,
+ this, &QItemModelScatterDataProxy::itemModelChanged);
+ QObject::connect(this, &QItemModelScatterDataProxy::xPosRoleChanged,
+ dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(this, &QItemModelScatterDataProxy::yPosRoleChanged,
+ dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+ QObject::connect(this, &QItemModelScatterDataProxy::zPosRoleChanged,
+ dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged);
+}
+
// QItemModelScatterDataProxyPrivate
QItemModelScatterDataProxyPrivate::QItemModelScatterDataProxyPrivate(QItemModelScatterDataProxy *q)