diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-03-10 03:00:41 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-03-10 03:00:41 +0100 |
commit | 41dd1405d5c5bfac05f9c42a4c4017de5075f5cc (patch) | |
tree | 4274b78b41dd1676d717e06d81f77e9b52b18974 /src | |
parent | 2f4726883b17fe2c935ac2e5d1bfa9b2bca8b5e3 (diff) | |
parent | 031a1e89e1baa952225c0f036b605f591f554e9b (diff) |
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: Id5cd236e14238612647f7a897886be0202863132
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/controls/doc/src/qtquickcontrols2-focus.qdoc | 47 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenu.cpp | 84 | ||||
-rw-r--r-- | src/imports/platform/qquickplatformmenu_p.h | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickapplicationwindow.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcombobox.cpp | 3 | ||||
-rw-r--r-- | src/quicktemplates2/qquickdrawer.cpp | 18 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenubar.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpage.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopup.cpp | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickrangeslider.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickscrollview.cpp | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickspinbox.cpp | 3 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickswipeview.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquicktabbar.cpp | 4 |
16 files changed, 170 insertions, 22 deletions
diff --git a/src/imports/controls/doc/src/qtquickcontrols2-focus.qdoc b/src/imports/controls/doc/src/qtquickcontrols2-focus.qdoc new file mode 100644 index 00000000..7883db71 --- /dev/null +++ b/src/imports/controls/doc/src/qtquickcontrols2-focus.qdoc @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qtquickcontrols2-focus.html + \title Focus Management in Qt Quick Controls 2 + \brief Overview of focus handling with Qt Quick Controls 2 + + Qt Quick Controls 2 follows the standard + \l {Keyboard Focus in Qt Quick}{Qt Quick focus system}, while also + providing some added convenience. For example, the + \l {Control::}{focusPolicy} property can be used to control the ways in + which a control receives focus. + + \section1 Focus Scope Controls + + Qt Quick Controls 2 offers a selection of controls that act as + \l {Acquiring Focus and Focus Scopes}{focus scopes}: + + \annotatedlist qtquickcontrols2-focusscopes + + \sa {Keyboard Focus in Qt Quick} +*/ diff --git a/src/imports/platform/qquickplatformmenu.cpp b/src/imports/platform/qquickplatformmenu.cpp index ec5c4804..0a5ce8e4 100644 --- a/src/imports/platform/qquickplatformmenu.cpp +++ b/src/imports/platform/qquickplatformmenu.cpp @@ -100,6 +100,68 @@ QT_BEGIN_NAMESPACE } \endcode + \section2 Submenus + + To create submenus, declare a Menu as a child of another Menu: + + \qml + Menu { + title: qsTr("Edit") + + Menu { + title: qsTr("Advanced") + + MenuItem { + text: qsTr("Auto-indent Selection") + onTriggered: autoIndentSelection() + } + + MenuItem { + text: qsTr("Rewrap Paragraph") + onTriggered: rewrapParagraph() + } + } + } + \endqml + + \section2 Dynamically Generating Menu Items + + It is possible to dynamically generate menu items. One of the easiest ways + to do so is with \l Instantiator. For example, to implement a + "Recent Files" submenu, where the items are based on a list of files stored + in settings, the following code could be used: + + \qml + Menu { + title: qsTr("File") + + Menu { + id: recentFilesSubMenu + title: qsTr("Recent Files") + enabled: recentFilesInstantiator.count > 0 + + Instantiator { + id: recentFilesInstantiator + model: settings.recentFiles + delegate: MenuItem { + text: settings.displayableFilePath(modelData) + onTriggered: loadFile(modelData) + } + + onObjectAdded: recentFilesSubMenu.insertItem(index, object) + onObjectRemoved: recentFilesSubMenu.removeItem(object) + } + + MenuSeparator {} + + MenuItem { + text: qsTr("Clear Recent Files") + onTriggered: settings.clearRecentFiles() + } + } + } + \endqml + \section2 Availability A native platform menu is currently available on the following platforms: @@ -154,15 +216,22 @@ QQuickPlatformMenu::~QQuickPlatformMenu() m_menuBar->removeMenu(this); if (m_parentMenu) m_parentMenu->removeMenu(this); + + unparentSubmenus(); + + delete m_iconLoader; + m_iconLoader = nullptr; + delete m_handle; + m_handle = nullptr; +} + +void QQuickPlatformMenu::unparentSubmenus() +{ for (QQuickPlatformMenuItem *item : qAsConst(m_items)) { if (QQuickPlatformMenu *subMenu = item->subMenu()) subMenu->setParentMenu(nullptr); item->setMenu(nullptr); } - delete m_iconLoader; - m_iconLoader = nullptr; - delete m_handle; - m_handle = nullptr; } QPlatformMenu *QQuickPlatformMenu::handle() const @@ -215,6 +284,10 @@ void QQuickPlatformMenu::destroy() if (!m_handle) return; + // Ensure that all submenus are unparented before we are destroyed, + // so that they don't try to access a destroyed menu. + unparentSubmenus(); + delete m_handle; m_handle = nullptr; } @@ -460,6 +533,9 @@ void QQuickPlatformMenu::setTitle(const QString &title) if (m_title == title) return; + if (m_menuItem) + m_menuItem->setText(title); + m_title = title; sync(); emit titleChanged(); diff --git a/src/imports/platform/qquickplatformmenu_p.h b/src/imports/platform/qquickplatformmenu_p.h index b5c23b61..14f083dd 100644 --- a/src/imports/platform/qquickplatformmenu_p.h +++ b/src/imports/platform/qquickplatformmenu_p.h @@ -189,6 +189,8 @@ private Q_SLOTS: void updateIcon(); private: + void unparentSubmenus(); + bool m_complete; bool m_enabled; bool m_visible; diff --git a/src/quicktemplates2/qquickapplicationwindow.cpp b/src/quicktemplates2/qquickapplicationwindow.cpp index c5c23695..370f47bb 100644 --- a/src/quicktemplates2/qquickapplicationwindow.cpp +++ b/src/quicktemplates2/qquickapplicationwindow.cpp @@ -59,6 +59,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.7 \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Styled top-level window with support for a header and footer. ApplicationWindow is a \l Window which makes it convenient to add @@ -110,7 +111,8 @@ QT_BEGIN_NAMESPACE certain window \c id. A QML component that uses the ApplicationWindow attached properties works in any window regardless of its \c id. - \sa {Customizing ApplicationWindow}, Overlay, Page, {Container Controls} + \sa {Customizing ApplicationWindow}, Overlay, Page, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ static const QQuickItemPrivate::ChangeTypes ItemChanges = QQuickItemPrivate::Visibility diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index 090b93ce..6aef6391 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -63,6 +63,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.7 \ingroup qtquickcontrols2-input + \ingroup qtquickcontrols2-focusscopes \brief Combined button and popup list for selecting options. \image qtquickcontrols2-combobox.gif @@ -133,7 +134,7 @@ QT_BEGIN_NAMESPACE \l textRole is not defined, ComboBox is unable to visualize it and throws a \c {ReferenceError: modelData is not defined}. - \sa {Customizing ComboBox}, {Input Controls} + \sa {Customizing ComboBox}, {Input Controls}, {Focus Management in Qt Quick Controls 2} */ /*! diff --git a/src/quicktemplates2/qquickdrawer.cpp b/src/quicktemplates2/qquickdrawer.cpp index 202d02d1..2d60e649 100644 --- a/src/quicktemplates2/qquickdrawer.cpp +++ b/src/quicktemplates2/qquickdrawer.cpp @@ -319,12 +319,17 @@ bool QQuickDrawerPrivate::startDrag(QEvent *event) return false; } +static inline bool keepGrab(QQuickItem *item) +{ + return item->keepMouseGrab() || item->keepTouchGrab(); +} + bool QQuickDrawerPrivate::grabMouse(QQuickItem *item, QMouseEvent *event) { Q_Q(QQuickDrawer); handleMouseEvent(item, event); - if (!window || !interactive || popupItem->keepMouseGrab() || popupItem->keepTouchGrab()) + if (!window || !interactive || keepGrab(popupItem) || keepGrab(item)) return false; const QPointF movePoint = event->windowPos(); @@ -352,12 +357,9 @@ bool QQuickDrawerPrivate::grabMouse(QQuickItem *item, QMouseEvent *event) } if (overThreshold) { - QQuickItem *grabber = window->mouseGrabberItem(); - if (!grabber || !grabber->keepMouseGrab()) { - popupItem->grabMouse(); - popupItem->setKeepMouseGrab(true); - offset = offsetAt(movePoint); - } + popupItem->grabMouse(); + popupItem->setKeepMouseGrab(true); + offset = offsetAt(movePoint); } return overThreshold; @@ -369,7 +371,7 @@ bool QQuickDrawerPrivate::grabTouch(QQuickItem *item, QTouchEvent *event) Q_Q(QQuickDrawer); bool handled = handleTouchEvent(item, event); - if (!window || !interactive || popupItem->keepTouchGrab() || !event->touchPointStates().testFlag(Qt::TouchPointMoved)) + if (!window || !interactive || keepGrab(popupItem) || keepGrab(item) || !event->touchPointStates().testFlag(Qt::TouchPointMoved)) return handled; bool overThreshold = false; diff --git a/src/quicktemplates2/qquickmenubar.cpp b/src/quicktemplates2/qquickmenubar.cpp index 14dd53a4..ee3d49f3 100644 --- a/src/quicktemplates2/qquickmenubar.cpp +++ b/src/quicktemplates2/qquickmenubar.cpp @@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.10 \ingroup qtquickcontrols2-menus + \ingroup qtquickcontrols2-focusscopes \brief Provides a window menu bar. \image qtquickcontrols2-menubar.png @@ -71,7 +72,8 @@ QT_BEGIN_NAMESPACE \l {removeMenu}{remove}, and \l {takeMenu}{take} menus dynamically. The menus in a menu bar can be accessed using \l menuAt(). - \sa {Customizing MenuBar}, Menu, MenuBarItem, {Menu Controls} + \sa {Customizing MenuBar}, Menu, MenuBarItem, {Menu Controls}, + {Focus Management in Qt Quick Controls 2} */ QQuickMenuBarPrivate::QQuickMenuBarPrivate() diff --git a/src/quicktemplates2/qquickpage.cpp b/src/quicktemplates2/qquickpage.cpp index 7f7cd5ad..b8838f20 100644 --- a/src/quicktemplates2/qquickpage.cpp +++ b/src/quicktemplates2/qquickpage.cpp @@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.7 \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Styled page control with support for a header and footer. Page is a container control which makes it convenient to add @@ -79,7 +80,8 @@ QT_BEGIN_NAMESPACE } \endqml - \sa ApplicationWindow, {Container Controls} + \sa ApplicationWindow, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ class QQuickPagePrivate : public QQuickPanePrivate diff --git a/src/quicktemplates2/qquickpane.cpp b/src/quicktemplates2/qquickpane.cpp index 7de0e1c5..98c4d1f3 100644 --- a/src/quicktemplates2/qquickpane.cpp +++ b/src/quicktemplates2/qquickpane.cpp @@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.7 \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Provides a background matching with the application style and theme. Pane provides a background color that matches with the application style @@ -101,7 +102,8 @@ QT_BEGIN_NAMESPACE } \endcode - \sa {Customizing Pane}, {Container Controls} + \sa {Customizing Pane}, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ static const QQuickItemPrivate::ChangeTypes ImplicitSizeChanges = QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight | QQuickItemPrivate::Destroyed; diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp index 48bb0f98..c21b8b68 100644 --- a/src/quicktemplates2/qquickpopup.cpp +++ b/src/quicktemplates2/qquickpopup.cpp @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.7 \ingroup qtquickcontrols2-popups + \ingroup qtquickcontrols2-focusscopes \brief Base type of popup-like user interface controls. Popup is the base type of popup-like user interface controls. It can be diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp index 075306cf..7205f26b 100644 --- a/src/quicktemplates2/qquickrangeslider.cpp +++ b/src/quicktemplates2/qquickrangeslider.cpp @@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.7 \ingroup qtquickcontrols2-input + \ingroup qtquickcontrols2-focusscopes \brief Used to select a range of values by sliding two handles along a track. \image qtquickcontrols2-rangeslider.gif @@ -85,7 +86,8 @@ QT_BEGIN_NAMESPACE RangeSlider. In the example above, \l {first.visualPosition} will be \c 0.24 in a left-to-right application, and \c 0.76 in a right-to-left application. - \sa {Customizing RangeSlider}, {Input Controls} + \sa {Customizing RangeSlider}, {Input Controls}, + {Focus Management in Qt Quick Controls 2} */ class QQuickRangeSliderNodePrivate : public QObjectPrivate diff --git a/src/quicktemplates2/qquickscrollview.cpp b/src/quicktemplates2/qquickscrollview.cpp index 254a90d7..30750aa8 100644 --- a/src/quicktemplates2/qquickscrollview.cpp +++ b/src/quicktemplates2/qquickscrollview.cpp @@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE \inqmlmodule QtQuick.Controls \since 5.9 \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Scrollable view. ScrollView provides scrolling for user-defined content. It can be used to @@ -97,6 +98,7 @@ QT_BEGIN_NAMESPACE \snippet qtquickcontrols2-scrollview-interactive.qml file \sa ScrollBar, ScrollIndicator, {Customizing ScrollView}, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ class QQuickScrollViewPrivate : public QQuickControlPrivate diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index 0591a3cc..8aa8ed5f 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -59,6 +59,7 @@ static const int AUTO_REPEAT_INTERVAL = 100; \inqmlmodule QtQuick.Controls \since 5.7 \ingroup input + \ingroup qtquickcontrols2-focusscopes \brief Allows the user to select from a set of preset values. \image qtquickcontrols2-spinbox.png @@ -91,7 +92,7 @@ static const int AUTO_REPEAT_INTERVAL = 100; \snippet qtquickcontrols2-spinbox-double.qml 1 - \sa Tumbler, {Customizing SpinBox} + \sa Tumbler, {Customizing SpinBox}, {Focus Management in Qt Quick Controls 2} */ /*! diff --git a/src/quicktemplates2/qquickstackview.cpp b/src/quicktemplates2/qquickstackview.cpp index 090a6d74..1abc506b 100644 --- a/src/quicktemplates2/qquickstackview.cpp +++ b/src/quicktemplates2/qquickstackview.cpp @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE \since 5.7 \ingroup qtquickcontrols2-navigation \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Provides a stack-based navigation model. \image qtquickcontrols2-stackview-wireframe.png @@ -342,7 +343,8 @@ QT_BEGIN_NAMESPACE } \endqml - \sa {Customizing StackView}, {Navigation Controls}, {Container Controls} + \sa {Customizing StackView}, {Navigation Controls}, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ QQuickStackView::QQuickStackView(QQuickItem *parent) diff --git a/src/quicktemplates2/qquickswipeview.cpp b/src/quicktemplates2/qquickswipeview.cpp index 5f84f93e..60bc9477 100644 --- a/src/quicktemplates2/qquickswipeview.cpp +++ b/src/quicktemplates2/qquickswipeview.cpp @@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE \since 5.7 \ingroup qtquickcontrols2-navigation \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Enables the user to navigate pages by swiping sideways. SwipeView provides a swipe-based navigation model. @@ -98,7 +99,8 @@ QT_BEGIN_NAMESPACE this only applies to the root of the item. Specifying width and height, or using anchors for its children works as expected. - \sa TabBar, PageIndicator, {Customizing SwipeView}, {Navigation Controls}, {Container Controls} + \sa TabBar, PageIndicator, {Customizing SwipeView}, {Navigation Controls}, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ class QQuickSwipeViewPrivate : public QQuickContainerPrivate diff --git a/src/quicktemplates2/qquicktabbar.cpp b/src/quicktemplates2/qquicktabbar.cpp index d86d9ec5..e2cd06fc 100644 --- a/src/quicktemplates2/qquicktabbar.cpp +++ b/src/quicktemplates2/qquicktabbar.cpp @@ -48,6 +48,7 @@ QT_BEGIN_NAMESPACE \since 5.7 \ingroup qtquickcontrols2-navigation \ingroup qtquickcontrols2-containers + \ingroup qtquickcontrols2-focusscopes \brief Allows the user to switch between different views or subtasks. TabBar provides a tab-based navigation model. @@ -90,7 +91,8 @@ QT_BEGIN_NAMESPACE \snippet qtquickcontrols2-tabbar-flickable.qml 1 - \sa TabButton, {Customizing TabBar}, {Navigation Controls}, {Container Controls} + \sa TabButton, {Customizing TabBar}, {Navigation Controls}, {Container Controls}, + {Focus Management in Qt Quick Controls 2} */ class QQuickTabBarPrivate : public QQuickContainerPrivate |