From 3d7f8820a86a4852fe2df27df53b745cfa32eb94 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 12 May 2014 12:55:10 +0300 Subject: Enable mapping single role to multiple properties for scatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3074 Change-Id: I7b1d338d28000eee7563a11a6069453f3e349c16 Reviewed-by: Tomi Korpipää --- .../data/qitemmodelscatterdataproxy.cpp | 314 ++++++++++++++++++++- 1 file changed, 302 insertions(+), 12 deletions(-) (limited to 'src/datavisualization/data/qitemmodelscatterdataproxy.cpp') diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index 16a7b8b5..ad588ab1 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -36,7 +36,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * unless the same frame also contains a change that causes the whole model to be 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 + * all items equally. It requires the model to provide 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 @@ -45,6 +45,16 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * \snippet doc_src_qtdatavisualization.cpp 4 * + * If the fields of the model do not contain the data in the exact format you need, you can specify + * a search pattern regular expression and a replace rule for each role to get the value in a + * format you need. For more information how the replace using regular expressions works, see + * QString::replace(const QRegExp &rx, const QString &after) function documentation. Note that + * using regular expressions has an impact on the performance, so it's more efficient to utilize + * item models where doing search and replace is not necessary to get the desired values. + * + * For example about using the search patterns in conjunction with the roles, see + * ItemModelBarDataProxy usage in \l{Qt Quick 2 Bars Example}. + * * \sa {Qt Data Visualization Data Handling} */ @@ -78,27 +88,109 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string ItemModelScatterDataProxy::xPosRole - * The X position role of the mapping. + * Defines the item model role to map into X position. */ /*! * \qmlproperty string ItemModelScatterDataProxy::yPosRole - * The Y position role of the mapping. + * Defines the item model role to map into Y position. */ /*! * \qmlproperty string ItemModelScatterDataProxy::zPosRole - * The Z position role of the mapping. + * Defines the item model role to map into Z position. */ /*! * \qmlproperty string ItemModelScatterDataProxy::rotationRole * - * Defines the rotation role for the mapping. + * Defines the item model role to map into item rotation. * The model may supply the value for rotation as either variant that is directly convertible - * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or \c{"@angle,x,y,z"}. The first - * will construct the quaternion directly with given values, and the second one will construct - * the quaternion using QQuaternion::fromAxisAndAngle() method. + * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or + * \c{"@angle,x,y,z"}. The first format will construct the quaternion directly with given values, + * and the second one will construct the quaternion using QQuaternion::fromAxisAndAngle() method. + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::xPosRolePattern + * + * When set, a search and replace is done on the value mapped by xPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and xPosRoleReplace property contains the replacement string. + * + * \sa xPosRole, xPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::yPosRolePattern + * + * When set, a search and replace is done on the value mapped by yPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and yPosRoleReplace property contains the replacement string. + * + * \sa yPosRole, yPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::zPosRolePattern + * + * When set, a search and replace is done on the value mapped by zPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and zPosRoleReplace property contains the replacement string. + * + * \sa zPosRole, zPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::rotationRolePattern + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a item rotation. This property specifies the regular expression to find the portion + * of the mapped value to replace and rotationRoleReplace property contains the replacement string. + * + * \sa rotationRole, rotationRoleReplace + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::xPosRoleReplace + * + * This property defines the replace content to be used in conjunction with xPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa xPosRole, xPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::yPosRoleReplace + * + * This property defines the replace content to be used in conjunction with yPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa yPosRole, yPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::zPosRoleReplace + * + * This property defines the replace content to be used in conjunction with zPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa zPosRole, zPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::rotationRoleReplace + * This property defines the replace content to be used in conjunction with rotationRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rotationRole, rotationRolePattern */ /*! @@ -190,7 +282,7 @@ const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const /*! * \property QItemModelScatterDataProxy::xPosRole * - * Defines the X position \a role for the mapping. + * Defines the item model role to map into X position. */ void QItemModelScatterDataProxy::setXPosRole(const QString &role) { @@ -208,7 +300,7 @@ QString QItemModelScatterDataProxy::xPosRole() const /*! * \property QItemModelScatterDataProxy::yPosRole * - * Defines the Y position \a role for the mapping. + * Defines the item model role to map into Y position. */ void QItemModelScatterDataProxy::setYPosRole(const QString &role) { @@ -226,7 +318,7 @@ QString QItemModelScatterDataProxy::yPosRole() const /*! * \property QItemModelScatterDataProxy::zPosRole * - * Defines the Z position \a role for the mapping. + * Defines the item model role to map into Z position. */ void QItemModelScatterDataProxy::setZPosRole(const QString &role) { @@ -244,7 +336,7 @@ QString QItemModelScatterDataProxy::zPosRole() const /*! * \property QItemModelScatterDataProxy::rotationRole * - * Defines the rotation \a role for the mapping. + * Defines the item model role to map into item rotation. * * The model may supply the value for rotation as either variant that is directly convertible * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or \c{"@angle,x,y,z"}. @@ -264,6 +356,186 @@ QString QItemModelScatterDataProxy::rotationRole() const return dptrc()->m_rotationRole; } +/*! + * \property QItemModelScatterDataProxy::xPosRolePattern + * + * When set, a search and replace is done on the value mapped by xPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and xPosRoleReplace property contains the replacement string. + * + * \sa xPosRole, xPosRoleReplace + */ +void QItemModelScatterDataProxy::setXPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_xPosRolePattern != pattern) { + dptr()->m_xPosRolePattern = pattern; + emit xPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::xPosRolePattern() const +{ + return dptrc()->m_xPosRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::yPosRolePattern + * + * When set, a search and replace is done on the value mapped by yPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and yPosRoleReplace property contains the replacement string. + * + * \sa yPosRole, yPosRoleReplace + */ +void QItemModelScatterDataProxy::setYPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_yPosRolePattern != pattern) { + dptr()->m_yPosRolePattern = pattern; + emit yPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::yPosRolePattern() const +{ + return dptrc()->m_yPosRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::zPosRolePattern + * + * When set, a search and replace is done on the value mapped by zPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and zPosRoleReplace property contains the replacement string. + * + * \sa zPosRole, zPosRoleReplace + */ +void QItemModelScatterDataProxy::setZPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_zPosRolePattern != pattern) { + dptr()->m_zPosRolePattern = pattern; + emit zPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::zPosRolePattern() const +{ + return dptrc()->m_zPosRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::rotationRolePattern + * + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a item rotation. This property specifies the regular expression to find the portion + * of the mapped value to replace and rotationRoleReplace property contains the replacement string. + * + * \sa rotationRole, rotationRoleReplace + */ +void QItemModelScatterDataProxy::setRotationRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rotationRolePattern != pattern) { + dptr()->m_rotationRolePattern = pattern; + emit rotationRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::rotationRolePattern() const +{ + return dptrc()->m_rotationRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::xPosRoleReplace + * + * This property defines the replace content to be used in conjunction with xPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa xPosRole, xPosRolePattern + */ +void QItemModelScatterDataProxy::setXPosRoleReplace(const QString &replace) +{ + if (dptr()->m_xPosRoleReplace != replace) { + dptr()->m_xPosRoleReplace = replace; + emit xPosRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::xPosRoleReplace() const +{ + return dptrc()->m_xPosRoleReplace; +} + +/*! + * \property QItemModelScatterDataProxy::yPosRoleReplace + * + * This property defines the replace content to be used in conjunction with yPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa yPosRole, yPosRolePattern + */ +void QItemModelScatterDataProxy::setYPosRoleReplace(const QString &replace) +{ + if (dptr()->m_yPosRoleReplace != replace) { + dptr()->m_yPosRoleReplace = replace; + emit yPosRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::yPosRoleReplace() const +{ + return dptrc()->m_yPosRoleReplace; +} + +/*! + * \property QItemModelScatterDataProxy::zPosRoleReplace + * + * This property defines the replace content to be used in conjunction with zPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa zPosRole, zPosRolePattern + */ +void QItemModelScatterDataProxy::setZPosRoleReplace(const QString &replace) +{ + if (dptr()->m_zPosRoleReplace != replace) { + dptr()->m_zPosRoleReplace = replace; + emit zPosRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::zPosRoleReplace() const +{ + return dptrc()->m_zPosRoleReplace; +} + +/*! + * \property QItemModelScatterDataProxy::rotationRoleReplace + * + * This property defines the replace content to be used in conjunction with rotationRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rotationRole, rotationRolePattern + */ +void QItemModelScatterDataProxy::setRotationRoleReplace(const QString &replace) +{ + if (dptr()->m_rotationRoleReplace != replace) { + dptr()->m_rotationRoleReplace = replace; + emit rotationRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::rotationRoleReplace() const +{ + return dptrc()->m_rotationRoleReplace; +} + /*! * Changes \a xPosRole, \a yPosRole, \a zPosRole, and \a rotationRole mapping. */ @@ -320,6 +592,24 @@ void QItemModelScatterDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelScatterDataProxy::zPosRoleChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::rotationRoleChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::xPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::yPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::zPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::rotationRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::xPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::yPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::zPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::rotationRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 7f505c5b6c1a613ffad90fb4d90ff81071cb6236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 2 Jun 2014 12:34:43 +0300 Subject: Fix QML item model crashes Needed to allow using charts and data visualization from the same application. Low-impact binary break Change-Id: I4b82e540b202e18e2e7a4278d06c9e9f43001a8f Change-Id: I4b82e540b202e18e2e7a4278d06c9e9f43001a8f Reviewed-by: Miikka Heikkinen --- src/datavisualization/data/qitemmodelscatterdataproxy.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/datavisualization/data/qitemmodelscatterdataproxy.cpp') diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index ad588ab1..56e164f9 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -206,7 +206,7 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(QObject *parent) * 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, +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel, QObject *parent) : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent) { @@ -220,7 +220,7 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, and zPosRole property * to \a zPosRole. */ -QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, @@ -240,7 +240,7 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, zPosRole property * to \a zPosRole, and rotationRole property to \a rotationRole. */ -QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, @@ -269,12 +269,12 @@ QItemModelScatterDataProxy::~QItemModelScatterDataProxy() * Defines the item model. Does not take ownership of the model, but does connect to it to listen for * changes. */ -void QItemModelScatterDataProxy::setItemModel(const QAbstractItemModel *itemModel) +void QItemModelScatterDataProxy::setItemModel(QAbstractItemModel *itemModel) { dptr()->m_itemModelHandler->setItemModel(itemModel); } -const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const +QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const { return dptrc()->m_itemModelHandler->itemModel(); } -- cgit v1.2.3 From 3eb656382e43fbd8cec36c801ec5eefd5efdcd77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 5 Jun 2014 07:00:48 +0300 Subject: Doc \since changes Task-number: QTRD-3150 All \since -tags changed to use the same format. Change-Id: I858afd61002cef7ecb3cf56deda0dabc431c4fd5 Change-Id: I858afd61002cef7ecb3cf56deda0dabc431c4fd5 Reviewed-by: Titta Heikkala --- src/datavisualization/data/qitemmodelscatterdataproxy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/datavisualization/data/qitemmodelscatterdataproxy.cpp') diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index 56e164f9..4e6464ea 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QItemModelScatterDataProxy * \inmodule QtDataVisualization * \brief Proxy class for presenting data in item models with Q3DScatter. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QItemModelScatterDataProxy allows you to use QAbstractItemModel derived models as a data source * for Q3DScatter. It maps roles of QAbstractItemModel to the XYZ-values of Q3DScatter points. -- cgit v1.2.3