diff options
author | Liang Qi <liang.qi@qt.io> | 2017-06-15 08:57:58 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-06-15 09:10:12 +0200 |
commit | 9f3aefb086c5f9d6b9dd192689bdd473da07186a (patch) | |
tree | 93349812f4a46305edf5e27f7e737d952e0d9a3a /src/quick | |
parent | a021bd87755ccfbe49e132f942ded935c9719b00 (diff) | |
parent | d2bb2e202427ebae545a408f065c893f3d837061 (diff) |
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts:
src/qml/compiler/qv4codegen.cpp
Change-Id: I3c41b9fc9ba7d41741e4dd400402ae80dd7726d9
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/doc/snippets/qml/regexp.qml | 46 | ||||
-rw-r--r-- | src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc | 59 | ||||
-rw-r--r-- | src/quick/doc/src/concepts/positioning/layouts.qdoc | 3 | ||||
-rw-r--r-- | src/quick/items/qquickgridview.cpp | 4 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 8 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 9 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 4 | ||||
-rw-r--r-- | src/quick/items/qquickrepeater.cpp | 6 | ||||
-rw-r--r-- | src/quick/scenegraph/adaptations/software/qsgsoftwarerenderablenode.cpp | 4 | ||||
-rw-r--r-- | src/quick/util/qquickvalidator.cpp | 13 |
10 files changed, 125 insertions, 31 deletions
diff --git a/src/quick/doc/snippets/qml/regexp.qml b/src/quick/doc/snippets/qml/regexp.qml new file mode 100644 index 0000000000..c30336d418 --- /dev/null +++ b/src/quick/doc/snippets/qml/regexp.qml @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +//![0] +TextInput { + id: hexNumber + validator: RegExpValidator { regExp: /[0-9A-F]+/ } +} +//![0] diff --git a/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc b/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc index 324fc9750f..47dcd6d98c 100644 --- a/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc +++ b/src/quick/doc/src/concepts/modelviewsdata/modelview.qdoc @@ -87,6 +87,7 @@ To visualize data, bind the view's \c model property to a model and the The club may decorate the members list by binding visual objects to the \c header and \c footer properties. The visual object may be defined inline, in another file, or in a \l {Component} type. + \snippet qml/listview-decorations.qml decorations \image listview-decorations.png @@ -102,7 +103,6 @@ To visualize data, bind the view's \c model property to a model and the will always ensure that the \c currentIndex is within the highlight range specified. - \section2 ListView Sections \l {ListView} contents may be grouped into \e sections, where related list @@ -195,7 +195,7 @@ To visualize data, bind the view's \c model property to a model and the Positioning of items from a model can be achieved using a \l{Repeater}. - \section2 ListModel + \section2 List Model ListModel is a simple hierarchy of types specified in QML. The available roles are specified by the \l ListElement properties. @@ -222,7 +222,7 @@ To visualize data, bind the view's \c model property to a model and the using the model. To reset the roles available in the model, call ListModel::clear(). - \section2 XmlListModel + \section2 XML Model XmlListModel allows construction of a model from an XML data source. The roles are specified via the \l XmlRole type. The type needs to be imported. @@ -244,23 +244,44 @@ To visualize data, bind the view's \c model property to a model and the } \endqml + The \c query property specifies that the XmlListModel generates a model item + for each \c <item> in the XML document. + The \l{Qt Quick Demo - RSS News}{RSS News demo} shows how XmlListModel can be used to display an RSS feed. - \section2 VisualItemModel + \section2 Object Model + + ObjectModel contains the visual items to be used in a view. When an ObjectModel + is used in a view, the view does not require a delegate because the ObjectModel + already contains the visual delegate (items). - VisualItemModel allows QML items to be provided as a model. + The example below places three colored rectangles in a ListView. - This model contains both the data and delegate; the child items of a - VisualItemModel provide the contents of the delegate. The model - does not provide any roles. + \code + import QtQuick 2.0 + import QtQml.Models 2.1 + + Rectangle { + ObjectModel { + id: itemModel + Rectangle { height: 30; width: 80; color: "red" } + Rectangle { height: 30; width: 80; color: "green" } + Rectangle { height: 30; width: 80; color: "blue" } + } - \snippet qml/models/visual-model-and-view.qml visual model and view + ListView { + anchors.fill: parent + model: itemModel + } + } + \endcode - Note that in the above example there is no delegate required. - The items of the model itself provide the visual types that - will be positioned by the view. + \note VisualItemModel can also be used, but it is only provided for compatibility + reasons. VisualItemModel allows a QML item to be provided as a model. This model + contains both the data and delegate; the child items of a VisualItemModel + provide the contents of the delegate. The model does not provide any roles. \section2 Integers as Models @@ -357,8 +378,18 @@ rectangles for the Grid item to position in a 5 by 5 arrangement. The number of items created by a Repeater is held by its \l{Repeater::}{count} property. It is not possible to set this property to determine the number of items to be created. Instead, as in the above example, we use an integer as -the model. This is explained in the \l{qtquick-modelviewsdata-modelview.html#integers-as-models}{QML Data Models} -document. +the model. + +For more details, see the \l{qtquick-modelviewsdata-modelview.html#integers-as-models}{QML Data Models} document. + +If the model is a string list, the delegate is also exposed to a read-only +\c modelData property that holds the string. For example: + +\table + \row + \li \snippet qml/repeaters/repeater.qml modeldata + \li \image repeater-modeldata.png +\endtable It is also possible to use a delegate as the template for the items created by a Repeater. This is specified using the \l{Repeater::}{delegate} property. diff --git a/src/quick/doc/src/concepts/positioning/layouts.qdoc b/src/quick/doc/src/concepts/positioning/layouts.qdoc index 47ed2563f8..3824d17559 100644 --- a/src/quick/doc/src/concepts/positioning/layouts.qdoc +++ b/src/quick/doc/src/concepts/positioning/layouts.qdoc @@ -133,6 +133,5 @@ control of spacing between items and between lines of items. There are several other ways to position items in a user interface. In addition to the basic technique of specifying their coordinates directly, they can be positioned relative to other items with \l{anchor-layout}{anchors}, or used -with \l{QML Data Models} such as -\l{QML Data Models#VisualItemModel}{VisualItemModel}. +with \l{QML Data Models} such as \l{QML Data Models#Object Model}{Object Model}. */ diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index fd78c46a16..c570b95a21 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -495,9 +495,7 @@ bool QQuickGridViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal // We've jumped more than a page. Estimate which items are now // visible and fill from there. int count = (fillFrom - (rowPos + rowSize())) / (rowSize()) * columns; - for (FxViewItem *item : qAsConst(visibleItems)) - releaseItem(item); - visibleItems.clear(); + releaseVisibleItems(); modelIndex += count; if (modelIndex >= model->count()) modelIndex = model->count() - 1; diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 555db03962..084b1f197a 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -380,9 +380,7 @@ void QQuickItemView::setDelegate(QQmlComponent *delegate) int oldCount = dataModel->count(); dataModel->setDelegate(delegate); if (isComponentComplete()) { - for (FxViewItem *item : qAsConst(d->visibleItems)) - d->releaseItem(item); - d->visibleItems.clear(); + d->releaseVisibleItems(); d->releaseItem(d->currentItem); d->currentItem = 0; d->updateSectionCriteria(); @@ -1743,9 +1741,7 @@ void QQuickItemViewPrivate::clear() currentChanges.reset(); timeline.clear(); - for (FxViewItem *item : qAsConst(visibleItems)) - releaseItem(item); - visibleItems.clear(); + releaseVisibleItems(); visibleIndex = 0; for (FxViewItem *item : qAsConst(releasePendingTransition)) { diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index 3087682ac7..b6353246e8 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -269,6 +269,15 @@ public: q->polish(); } + void releaseVisibleItems() { + // make a copy and clear the visibleItems first to avoid destroyed + // items being accessed during the loop (QTBUG-61294) + const QList<FxViewItem *> oldVisible = visibleItems; + visibleItems.clear(); + for (FxViewItem *item : oldVisible) + releaseItem(item); + } + QPointer<QQmlInstanceModel> model; QVariant modelVariant; int itemCount; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index f739115e6b..18f9b8512d 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -660,9 +660,7 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal int newModelIdx = qBound(0, modelIndex + count, model->count()); count = newModelIdx - modelIndex; if (count) { - for (FxViewItem *item : qAsConst(visibleItems)) - releaseItem(item); - visibleItems.clear(); + releaseVisibleItems(); modelIndex = newModelIdx; visibleIndex = modelIndex; visiblePos = itemEnd + count * (averageSize + spacing); diff --git a/src/quick/items/qquickrepeater.cpp b/src/quick/items/qquickrepeater.cpp index 9ad7d27b18..6fc4c0553a 100644 --- a/src/quick/items/qquickrepeater.cpp +++ b/src/quick/items/qquickrepeater.cpp @@ -314,7 +314,11 @@ void QQuickRepeater::setDelegate(QQmlComponent *delegate) /*! \qmlproperty int QtQuick::Repeater::count - This property holds the number of items in the repeater. + This property holds the number of items in the model. + + \note The number of items in the model as reported by count may differ from + the number of created delegates if the Repeater is in the process of + instantiating delegates or is incorrectly set up. */ int QQuickRepeater::count() const { diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderablenode.cpp b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderablenode.cpp index 0f4a0ac8f5..307615a216 100644 --- a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderablenode.cpp +++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderablenode.cpp @@ -232,8 +232,8 @@ void QSGSoftwareRenderableNode::update() m_boundingRectMin = QRect(); m_boundingRectMax = QRect(); } else { - m_boundingRectMin = m_boundingRectMin.intersected(m_clipRegion.rects().first()); - m_boundingRectMax = m_boundingRectMax.intersected(m_clipRegion.rects().first()); + m_boundingRectMin = m_boundingRectMin.intersected(m_clipRegion.rects().constFirst()); + m_boundingRectMax = m_boundingRectMax.intersected(m_clipRegion.rects().constFirst()); } } diff --git a/src/quick/util/qquickvalidator.cpp b/src/quick/util/qquickvalidator.cpp index a05117bd06..93f414fe80 100644 --- a/src/quick/util/qquickvalidator.cpp +++ b/src/quick/util/qquickvalidator.cpp @@ -219,6 +219,19 @@ void QQuickDoubleValidator::resetLocaleName() matching "a". By default, this property contains a regular expression with the pattern .* that matches any string. + + Below you can find an example of a \l TextInput object with a RegExpValidator specified: + + \snippet qml/regexp.qml 0 + + Some more examples of regular expressions: + + \list + \li A list of numbers with one to three positions separated by a comma: + /\d{1,3}(?:,\d{1,3})+$/ + \li An amount consisting of up to 3 numbers before the decimal point, and + 1 to 2 after the decimal point: \li /(\d{1,3})([.,]\d{1,2})?$/ + \endlist */ #endif // validator |