aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-04-13 03:00:59 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-04-13 03:00:59 +0200
commitced7d5af9caeedd7b3a2278b052a0b0f7bf951b7 (patch)
tree71a123c1058574f9213936c01a0e59cc6e87f33f
parent131210b59133fcebe0ab3c7823777f2b859dc7cd (diff)
parentbd126fdea95ed994fdd35d50e445b45af75657ab (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13v5.13.0-beta3
-rw-r--r--src/quicktemplates2/qquickcombobox.cpp10
-rw-r--r--src/quicktemplates2/qquickpane.cpp16
-rw-r--r--src/quicktemplates2/qquickspinbox.cpp6
-rw-r--r--src/quicktemplates2/qquickstackview.cpp29
-rw-r--r--tests/auto/controls/data/tst_combobox.qml51
-rw-r--r--tests/auto/controls/data/tst_spinbox.qml33
6 files changed, 138 insertions, 7 deletions
diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp
index 03dd6086..328797b8 100644
--- a/src/quicktemplates2/qquickcombobox.cpp
+++ b/src/quicktemplates2/qquickcombobox.cpp
@@ -1556,10 +1556,10 @@ bool QQuickComboBox::eventFilter(QObject *object, QEvent *event)
break;
}
case QEvent::FocusOut:
- if (qGuiApp->focusObject() != this) {
+ if (qGuiApp->focusObject() != this && (!d->popup || !d->popup->hasActiveFocus())) {
// Only close the popup if focus was transferred somewhere else
- // than to the popup button (which normally means that the user
- // clicked on the popup button to open it, not close it.
+ // than to the popup or the popup button (which normally means that
+ // the user clicked on the popup button to open it, not close it).
d->hidePopup(false);
setPressed(false);
}
@@ -1589,9 +1589,9 @@ void QQuickComboBox::focusOutEvent(QFocusEvent *event)
Q_D(QQuickComboBox);
QQuickControl::focusOutEvent(event);
- if (qGuiApp->focusObject() != d->contentItem) {
+ if (qGuiApp->focusObject() != d->contentItem && (!d->popup || !d->popup->hasActiveFocus())) {
// Only close the popup if focus was transferred
- // somewhere else than to the inner line edit (which is
+ // somewhere else than to the popup or the inner line edit (which is
// normally done from QQuickComboBox::focusInEvent).
d->hidePopup(false);
setPressed(false);
diff --git a/src/quicktemplates2/qquickpane.cpp b/src/quicktemplates2/qquickpane.cpp
index 3edbce9d..fd9d2cf0 100644
--- a/src/quicktemplates2/qquickpane.cpp
+++ b/src/quicktemplates2/qquickpane.cpp
@@ -103,6 +103,22 @@ QT_BEGIN_NAMESPACE
}
\endcode
+ If the \l contentItem has no implicit size and only one child, Pane will
+ use the implicit size of that child. For example, in the following code,
+ the Pane will assume the size of the Rectangle:
+
+ \code
+ Pane {
+ Item {
+ Rectangle {
+ implicitWidth: 200
+ implicitHeight: 200
+ color: "salmon"
+ }
+ }
+ }
+ \endcode
+
\sa {Customizing Pane}, {Container Controls},
{Focus Management in Qt Quick Controls 2}, {Event Handling}
*/
diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp
index 6af1d8e8..274929b0 100644
--- a/src/quicktemplates2/qquickspinbox.cpp
+++ b/src/quicktemplates2/qquickspinbox.cpp
@@ -362,8 +362,10 @@ void QQuickSpinBoxPrivate::handleMove(const QPointF &point)
QQuickControlPrivate::handleMove(point);
QQuickItem *ui = up->indicator();
QQuickItem *di = down->indicator();
- up->setPressed(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(q, point)));
- down->setPressed(di && di->isEnabled() && di->contains(di->mapFromItem(q, point)));
+ up->setHovered(ui && ui->isEnabled() && ui->contains(ui->mapFromItem(q, point)));
+ up->setPressed(up->isHovered());
+ down->setHovered(di && di->isEnabled() && di->contains(di->mapFromItem(q, point)));
+ down->setPressed(down->isHovered());
bool pressed = up->isPressed() || down->isPressed();
q->setAccessibleProperty("pressed", pressed);
diff --git a/src/quicktemplates2/qquickstackview.cpp b/src/quicktemplates2/qquickstackview.cpp
index 6dae65c8..18f65127 100644
--- a/src/quicktemplates2/qquickstackview.cpp
+++ b/src/quicktemplates2/qquickstackview.cpp
@@ -343,6 +343,35 @@ QT_BEGIN_NAMESPACE
}
\endqml
+ \section1 Size
+
+ StackView does not inherit an implicit size from items that are pushed onto
+ it. This means that using it as the \l {Popup::}{contentItem} of a
+ \l Dialog, for example, will not work as expected:
+
+ \code
+ Dialog {
+ StackView {
+ initialItem: Rectangle {
+ width: 200
+ height: 200
+ color: "salmon"
+ }
+ }
+ }
+ \endcode
+
+ There are several ways to ensure that StackView has a size in this
+ situation:
+
+ \list
+ \li Set \l implicitWidth and \l implicitHeight on the StackView itself.
+ \li Set \l implicitWidth and \l implicitHeight on the \l Rectangle.
+ \li Set \l {Popup::}{contentWidth} and \l {Popup::}{contentHeight} on
+ the Dialog.
+ \li Give the Dialog a size.
+ \endlist
+
\sa {Customizing StackView}, {Navigation Controls}, {Container Controls},
{Focus Management in Qt Quick Controls 2}
*/
diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml
index 70c4f090..0d266e1a 100644
--- a/tests/auto/controls/data/tst_combobox.qml
+++ b/tests/auto/controls/data/tst_combobox.qml
@@ -85,6 +85,17 @@ TestCase {
MouseArea { }
}
+ Component {
+ id: customPopup
+ Popup {
+ width: 100
+ implicitHeight: contentItem.implicitHeight
+ contentItem: TextInput {
+ anchors.fill: parent
+ }
+ }
+ }
+
function init() {
// QTBUG-61225: Move the mouse away to avoid QQuickWindowPrivate::flushFrameSynchronousEvents()
// delivering interfering hover events based on the last mouse position from earlier tests. For
@@ -1680,4 +1691,44 @@ TestCase {
compare(container.releasedKeys, ++releasedKeys)
compare(container.lastReleasedKey, data.key)
}
+
+ function test_popupFocus_QTBUG_74661() {
+ var control = createTemporaryObject(comboBox, testCase)
+ verify(control)
+
+ var popup = createTemporaryObject(customPopup, testCase)
+ verify(popup)
+
+ control.popup = popup
+
+ var openedSpy = signalSpy.createObject(control, {target: popup, signalName: "opened"})
+ verify(openedSpy.valid)
+
+ var closedSpy = signalSpy.createObject(control, {target: popup, signalName: "closed"})
+ verify(closedSpy.valid)
+
+ control.forceActiveFocus()
+ verify(control.activeFocus)
+
+ // show popup
+ keyClick(Qt.Key_Space)
+ openedSpy.wait()
+ compare(openedSpy.count, 1)
+
+ popup.contentItem.forceActiveFocus()
+ verify(popup.contentItem.activeFocus)
+
+ // type something in the text field
+ keyClick(Qt.Key_Space)
+ keyClick(Qt.Key_H)
+ keyClick(Qt.Key_I)
+ compare(popup.contentItem.text, " hi")
+
+ compare(closedSpy.count, 0)
+
+ // hide popup
+ keyClick(Qt.Key_Escape)
+ closedSpy.wait()
+ compare(closedSpy.count, 1)
+ }
}
diff --git a/tests/auto/controls/data/tst_spinbox.qml b/tests/auto/controls/data/tst_spinbox.qml
index 419478a2..d3a0d8bb 100644
--- a/tests/auto/controls/data/tst_spinbox.qml
+++ b/tests/auto/controls/data/tst_spinbox.qml
@@ -486,6 +486,39 @@ TestCase {
compare(button.hovered, false)
}
+ function test_hoverWhilePressed_data() {
+ return [
+ { tag: "up" },
+ { tag: "down" },
+ ]
+ }
+
+ // QTBUG-74688
+ function test_hoverWhilePressed(data) {
+ var control = createTemporaryObject(spinBox, testCase, { hoverEnabled: true, value: 50 })
+ verify(control)
+
+ var button = control[data.tag]
+ compare(control.hovered, false)
+ compare(button.hovered, false)
+
+ // Hover over the indicator. It should be hovered.
+ var buttonXCenter = button.indicator.x + button.indicator.width / 2
+ var buttonYCenter = button.indicator.y + button.indicator.height / 2
+ mouseMove(control, buttonXCenter, buttonYCenter)
+ compare(button.hovered, true)
+
+ // Press on the indicator and then move the mouse outside of it.
+ mousePress(control, buttonXCenter, buttonYCenter)
+ compare(button.hovered, true)
+ mouseMove(control, buttonXCenter - button.indicator.width, buttonYCenter - button.indicator.height)
+ // It should not be pressed or hovered.
+ compare(button.pressed, false)
+ compare(button.hovered, false)
+
+ mouseRelease(control)
+ }
+
function test_valueFromText_data() {
return [
{ tag: "editable", editable: true },