diff options
Diffstat (limited to 'src/datavisualization/data/qitemmodelbardataproxy.cpp')
-rw-r--r-- | src/datavisualization/data/qitemmodelbardataproxy.cpp | 403 |
1 files changed, 379 insertions, 24 deletions
diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index 2281e33f..3d4a980a 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QItemModelBarDataProxy * \inmodule QtDataVisualization * \brief Proxy class for presenting data in item models with Q3DBars. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QItemModelBarDataProxy allows you to use QAbstractItemModel derived models as a data source * for Q3DBars. It uses the defined mappings to map data from the model to rows, columns, and @@ -33,6 +33,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * The data is resolved asynchronously whenever mappings or the model changes. * QBarDataProxy::arrayReset() is emitted when the data has been resolved. + * However, when useModelCategories property is set to true, single item changes are resolved + * synchronously, unless the same frame also contains a change that causes the whole model to be + * resolved. * * There are three ways to use mappings: * @@ -50,12 +53,22 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * and in which order by defining an explicit list of categories for either or both of rows and * columns. * - * For example, assume that you have a custom QAbstractItemModel for storing various monthly values - * related to a business. - * Each item in the model has the roles "year", "month", "income", and "expenses". - * You could do the following to display the data in a bar graph: + * For example, assume that you have a custom QAbstractItemModel for storing various monthly values + * related to a business. + * Each item in the model has the roles "year", "month", "income", and "expenses". + * You could do the following to display the data in a bar graph: + * + * \snippet doc_src_qtdatavisualization.cpp 3 + * + * 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. * - * \snippet doc_src_qtdatavisualization.cpp 3 + * For example about using the search patterns in conjunction with the roles, see + * \l{Qt Quick 2 Bars Example}. * * \sa {Qt Data Visualization Data Handling} */ @@ -74,6 +87,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Data is resolved asynchronously whenever the mapping or the model changes. * QBarDataProxy::arrayReset() is emitted when the data has been resolved. * + * For ItemModelBarDataProxy enums, see \l{QItemModelBarDataProxy::MultiMatchBehavior}. + * * For more details, see QItemModelBarDataProxy documentation. * * Usage example: @@ -90,35 +105,36 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string ItemModelBarDataProxy::rowRole - * The row role of the mapping. + * Defines the item model role to map into row category. */ /*! * \qmlproperty string ItemModelBarDataProxy::columnRole - * The column role of the mapping. + * Defines the item model role to map into column category. */ /*! * \qmlproperty string ItemModelBarDataProxy::valueRole - * The value role of the mapping. + * Defines the item model role to map into bar value. */ /*! * \qmlproperty string ItemModelBarDataProxy::rotationRole - * - * Defines the rotation role for the mapping. + * Defines the item model role to map into bar rotation angle. */ /*! * \qmlproperty list<String> ItemModelBarDataProxy::rowCategories - * The row categories of the mapping. Only items with row roles that are found in this list are - * included when the data is resolved. The rows are ordered in the same order as they are in this list. + * The row categories of the mapping. Only items with row role values that are found in this list + * are included when the data is resolved. The rows are ordered in the same order as they are in + * this list. */ /*! * \qmlproperty list<String> ItemModelBarDataProxy::columnCategories - * The column categories of the mapping. Only items with column roles that are found in this list are - * included when the data is resolved. The columns are ordered in the same order as they are in this list. + * The column categories of the mapping. Only items with column role values that are found in this + * list are included when the data is resolved. The columns are ordered in the same order as they + * are in this list. */ /*! @@ -143,6 +159,117 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION */ /*! + * \qmlproperty regExp ItemModelBarDataProxy::rowRolePattern + * When set, a search and replace is done on the value mapped by row role before it is used as + * a row category. This property specifies the regular expression to find the portion of the + * mapped value to replace and rowRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from a single + * timestamp field in the item model. + * + * \sa rowRole, rowRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelBarDataProxy::columnRolePattern + * When set, a search and replace is done on the value mapped by column role before it is used + * as a column category. This property specifies the regular expression to find the portion of the + * mapped value to replace and columnRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from + * a single timestamp field in the item model. + * + * \sa columnRole, columnRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelBarDataProxy::valueRolePattern + * When set, a search and replace is done on the value mapped by value role before it is used as + * a bar value. This property specifies the regular expression to find the portion of the + * mapped value to replace and valueRoleReplace property contains the replacement string. + * + * \sa valueRole, valueRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelBarDataProxy::rotationRolePattern + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a bar rotation angle. 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 ItemModelBarDataProxy::rowRoleReplace + * This property defines the replace content to be used in conjunction with rowRolePattern. + * 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 rowRole, rowRolePattern + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::columnRoleReplace + * This property defines the replace content to be used in conjunction with columnRolePattern. + * 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 columnRole, columnRolePattern + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::valueRoleReplace + * This property defines the replace content to be used in conjunction with valueRolePattern. + * 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 valueRole, valueRolePattern + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::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 + */ + +/*! + * \qmlproperty ItemModelBarDataProxy.MultiMatchBehavior ItemModelBarDataProxy::multiMatchBehavior + * This property defines how multiple matches for each row/column combination are handled. + * Defaults to ItemModelBarDataProxy.MMBLast. The chosen behavior affects both bar value + * and rotation. + * + * For example, you might have an item model with timestamped data taken at irregular intervals + * and you want to visualize total value of data items on each day with a bar graph. + * This can be done by specifying row and column categories so that each bar represents a day, + * and setting multiMatchBehavior to ItemModelBarDataProxy.MMBCumulative. + */ + +/*! + * \enum QItemModelBarDataProxy::MultiMatchBehavior + * + * Behavior types for QItemModelBarDataProxy::multiMatchBehavior property. + * + * \value MMBFirst + * The value is taken from the first item in the item model that matches + * each row/column combination. + * \value MMBLast + * The value is taken from the last item in the item model that matches + * each row/column combination. + * \value MMBAverage + * The values from all items matching each row/column combination are + * averaged together and the average is used as the bar value. + * \value MMBCumulative + * The values from all items matching each row/column combination are + * added together and the total is used as the bar value. + */ + +/*! * Constructs QItemModelBarDataProxy with optional \a parent. */ QItemModelBarDataProxy::QItemModelBarDataProxy(QObject *parent) @@ -155,7 +282,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(QObject *parent) * Constructs QItemModelBarDataProxy 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. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QObject *parent) +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, QObject *parent) : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) { setItemModel(itemModel); @@ -169,7 +296,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * This constructor is meant to be used with models that have data properly sorted * in rows and columns already, so it also sets useModelCategories property to true. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &valueRole, QObject *parent) : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) { @@ -184,7 +311,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * ownership of the \a itemModel, as typically item models are owned by other controls. * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, QObject *parent) @@ -202,7 +329,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * ownership of the \a itemModel, as typically item models are owned by other controls. * The role mappings are set with \a rowRole, \a columnRole, \a valueRole, and \a rotationRole. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, @@ -225,7 +352,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * Row and column categories are set with \a rowCategories and \a columnCategories. * This constructor also sets autoRowCategories and autoColumnCategories to false. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, @@ -252,7 +379,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * Row and column categories are set with \a rowCategories and \a columnCategories. * This constructor also sets autoRowCategories and autoColumnCategories to false. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, @@ -287,12 +414,12 @@ QItemModelBarDataProxy::~QItemModelBarDataProxy() * Defines item model. Does not take ownership of the model, but does connect to it to listen for * changes. */ -void QItemModelBarDataProxy::setItemModel(const QAbstractItemModel *itemModel) +void QItemModelBarDataProxy::setItemModel(QAbstractItemModel *itemModel) { dptr()->m_itemModelHandler->setItemModel(itemModel); } -const QAbstractItemModel *QItemModelBarDataProxy::itemModel() const +QAbstractItemModel *QItemModelBarDataProxy::itemModel() const { return dptrc()->m_itemModelHandler->itemModel(); } @@ -506,6 +633,215 @@ int QItemModelBarDataProxy::columnCategoryIndex(const QString &category) } /*! + * \property QItemModelBarDataProxy::rowRolePattern + * + * When set, a search and replace is done on the value mapped by row role before it is used as + * a row category. This property specifies the regular expression to find the portion of the + * mapped value to replace and rowRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from a single + * timestamp field in the item model. + * + * \sa rowRole, rowRoleReplace + */ +void QItemModelBarDataProxy::setRowRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rowRolePattern != pattern) { + dptr()->m_rowRolePattern = pattern; + emit rowRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::rowRolePattern() const +{ + return dptrc()->m_rowRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::columnRolePattern + * + * When set, a search and replace is done on the value mapped by column role before it is used + * as a column category. This property specifies the regular expression to find the portion of the + * mapped value to replace and columnRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from + * a single timestamp field in the item model. + * + * \sa columnRole, columnRoleReplace + */ +void QItemModelBarDataProxy::setColumnRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_columnRolePattern != pattern) { + dptr()->m_columnRolePattern = pattern; + emit columnRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::columnRolePattern() const +{ + return dptrc()->m_columnRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::valueRolePattern + * + * When set, a search and replace is done on the value mapped by value role before it is used as + * a bar value. This property specifies the regular expression to find the portion of the + * mapped value to replace and valueRoleReplace property contains the replacement string. + * + * \sa valueRole, valueRoleReplace + */ +void QItemModelBarDataProxy::setValueRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_valueRolePattern != pattern) { + dptr()->m_valueRolePattern = pattern; + emit valueRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::valueRolePattern() const +{ + return dptrc()->m_valueRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::rotationRolePattern + * + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a bar rotation angle. 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 QItemModelBarDataProxy::setRotationRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rotationRolePattern != pattern) { + dptr()->m_rotationRolePattern = pattern; + emit rotationRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::rotationRolePattern() const +{ + return dptrc()->m_rotationRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::rowRoleReplace + * + * This property defines the replace content to be used in conjunction with rowRolePattern. + * 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 rowRole, rowRolePattern + */ +void QItemModelBarDataProxy::setRowRoleReplace(const QString &replace) +{ + if (dptr()->m_rowRoleReplace != replace) { + dptr()->m_rowRoleReplace = replace; + emit rowRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::rowRoleReplace() const +{ + return dptrc()->m_rowRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::columnRoleReplace + * + * This property defines the replace content to be used in conjunction with columnRolePattern. + * 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 columnRole, columnRolePattern + */ +void QItemModelBarDataProxy::setColumnRoleReplace(const QString &replace) +{ + if (dptr()->m_columnRoleReplace != replace) { + dptr()->m_columnRoleReplace = replace; + emit columnRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::columnRoleReplace() const +{ + return dptrc()->m_columnRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::valueRoleReplace + * + * This property defines the replace content to be used in conjunction with valueRolePattern. + * 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 valueRole, valueRolePattern + */ +void QItemModelBarDataProxy::setValueRoleReplace(const QString &replace) +{ + if (dptr()->m_valueRoleReplace != replace) { + dptr()->m_valueRoleReplace = replace; + emit valueRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::valueRoleReplace() const +{ + return dptrc()->m_valueRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::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 QItemModelBarDataProxy::setRotationRoleReplace(const QString &replace) +{ + if (dptr()->m_rotationRoleReplace != replace) { + dptr()->m_rotationRoleReplace = replace; + emit rotationRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::rotationRoleReplace() const +{ + return dptrc()->m_rotationRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::multiMatchBehavior + * + * This property defines how multiple matches for each row/column combination are handled. + * Defaults to QItemModelBarDataProxy::MMBLast. The chosen behavior affects both bar value + * and rotation. + * + * For example, you might have an item model with timestamped data taken at irregular intervals + * and you want to visualize total value of data items on each day with a bar graph. + * This can be done by specifying row and column categories so that each bar represents a day, + * and setting multiMatchBehavior to QItemModelBarDataProxy::MMBCumulative. + */ +void QItemModelBarDataProxy::setMultiMatchBehavior(QItemModelBarDataProxy::MultiMatchBehavior behavior) +{ + if (dptr()->m_multiMatchBehavior != behavior) { + dptr()->m_multiMatchBehavior = behavior; + emit multiMatchBehaviorChanged(behavior); + } +} + +QItemModelBarDataProxy::MultiMatchBehavior QItemModelBarDataProxy::multiMatchBehavior() const +{ + return dptrc()->m_multiMatchBehavior; +} + +/*! * \internal */ QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptr() @@ -528,7 +864,8 @@ QItemModelBarDataProxyPrivate::QItemModelBarDataProxyPrivate(QItemModelBarDataPr m_itemModelHandler(new BarItemModelHandler(q)), m_useModelCategories(false), m_autoRowCategories(true), - m_autoColumnCategories(true) + m_autoColumnCategories(true), + m_multiMatchBehavior(QItemModelBarDataProxy::MMBLast) { } @@ -564,6 +901,24 @@ void QItemModelBarDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelBarDataProxy::autoColumnCategoriesChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rowRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::columnRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::valueRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rowRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::columnRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::valueRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::multiMatchBehaviorChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION |