From ed64115cbf11a758a9cacd2bd34f3af5603f73b7 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 4 Apr 2017 16:18:39 +0200 Subject: Set explicit cursors on all interactive controls For example, if you have a floating button on top of a text editor, hovering the button must change the cursor from the editor's ibeam cursor to an arrow cursor. This applies to all interactive controls that call setAcceptedMouseButtons(). If a control blocks mouse events, it should not use some random cursor from another control underneath. Task-number: QTBUG-59629 Change-Id: I8a6ae306bbc76a9b22377361cb19cf9c3a872d31 Reviewed-by: Mitch Curtis --- src/imports/calendar/qquickmonthgrid.cpp | 3 +++ src/quicktemplates2/qquickabstractbutton.cpp | 6 ++++++ src/quicktemplates2/qquickcombobox.cpp | 12 ++++++++++++ src/quicktemplates2/qquickdial.cpp | 3 +++ src/quicktemplates2/qquickoverlay.cpp | 3 +++ src/quicktemplates2/qquickpage.cpp | 3 +++ src/quicktemplates2/qquickpageindicator.cpp | 12 +++++++++++- src/quicktemplates2/qquickpane.cpp | 6 ++++++ src/quicktemplates2/qquickrangeslider.cpp | 5 ++++- src/quicktemplates2/qquickscrollbar.cpp | 13 +++++++++++-- src/quicktemplates2/qquickslider.cpp | 3 +++ src/quicktemplates2/qquickspinbox.cpp | 17 +++++++++++++++++ 12 files changed, 82 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/imports/calendar/qquickmonthgrid.cpp b/src/imports/calendar/qquickmonthgrid.cpp index 5eb0798c..9621f49a 100644 --- a/src/imports/calendar/qquickmonthgrid.cpp +++ b/src/imports/calendar/qquickmonthgrid.cpp @@ -195,6 +195,9 @@ QQuickMonthGrid::QQuickMonthGrid(QQuickItem *parent) : setFlag(ItemIsFocusScope); setActiveFocusOnTab(true); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif d->model = new QQuickMonthModel(this); d->source = QVariant::fromValue(d->model); diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index 225ab9ab..7c2ced66 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -308,6 +308,9 @@ QQuickAbstractButton::QQuickAbstractButton(QQuickItem *parent) setActiveFocusOnTab(true); setFocusPolicy(Qt::StrongFocus); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } QQuickAbstractButton::QQuickAbstractButton(QQuickAbstractButtonPrivate &dd, QQuickItem *parent) @@ -316,6 +319,9 @@ QQuickAbstractButton::QQuickAbstractButton(QQuickAbstractButtonPrivate &dd, QQui setActiveFocusOnTab(true); setFocusPolicy(Qt::StrongFocus); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } QQuickAbstractButton::~QQuickAbstractButton() diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index 786db55b..85c577b4 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -628,6 +628,9 @@ QQuickComboBox::QQuickComboBox(QQuickItem *parent) setFocusPolicy(Qt::StrongFocus); setFlag(QQuickItem::ItemIsFocusScope); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif setInputMethodHints(Qt::ImhNoPredictiveText); } @@ -737,12 +740,18 @@ void QQuickComboBox::setEditable(bool editable) QObjectPrivate::connect(input, &QQuickTextInput::textChanged, d, &QQuickComboBoxPrivate::updateEditText); QObjectPrivate::connect(input, &QQuickTextInput::accepted, d, &QQuickComboBoxPrivate::acceptInput); } +#if QT_CONFIG(cursor) + d->contentItem->setCursor(Qt::IBeamCursor); +#endif } else { d->contentItem->removeEventFilter(this); if (QQuickTextInput *input = qobject_cast(d->contentItem)) { QObjectPrivate::disconnect(input, &QQuickTextInput::textChanged, d, &QQuickComboBoxPrivate::updateEditText); QObjectPrivate::disconnect(input, &QQuickTextInput::accepted, d, &QQuickComboBoxPrivate::acceptInput); } +#if QT_CONFIG(cursor) + d->contentItem->unsetCursor(); +#endif } } @@ -1542,6 +1551,9 @@ void QQuickComboBox::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) connect(newInput, &QQuickTextInput::inputMethodComposingChanged, this, &QQuickComboBox::inputMethodComposingChanged); connect(newInput, &QQuickTextInput::acceptableInputChanged, this, &QQuickComboBox::acceptableInputChanged); } +#if QT_CONFIG(cursor) + newItem->setCursor(Qt::IBeamCursor); +#endif } } diff --git a/src/quicktemplates2/qquickdial.cpp b/src/quicktemplates2/qquickdial.cpp index 24a8df01..c7fbdc80 100644 --- a/src/quicktemplates2/qquickdial.cpp +++ b/src/quicktemplates2/qquickdial.cpp @@ -260,6 +260,9 @@ QQuickDial::QQuickDial(QQuickItem *parent) { setActiveFocusOnTab(true); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } /*! diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp index c72979ae..d31186cd 100644 --- a/src/quicktemplates2/qquickoverlay.cpp +++ b/src/quicktemplates2/qquickoverlay.cpp @@ -97,6 +97,9 @@ static QQuickItem *createDimmer(QQmlComponent *component, QQuickPopup *popup, QQ item->setZ(popup->z()); if (popup->isModal()) { item->setAcceptedMouseButtons(Qt::AllButtons); +#if QT_CONFIG(cursor) + item->setCursor(Qt::ArrowCursor); +#endif #if QT_CONFIG(quicktemplates2_hover) // TODO: switch to QStyleHints::useHoverEffects in Qt 5.8 item->setAcceptHoverEvents(true); diff --git a/src/quicktemplates2/qquickpage.cpp b/src/quicktemplates2/qquickpage.cpp index 701916b6..6b0b3a38 100644 --- a/src/quicktemplates2/qquickpage.cpp +++ b/src/quicktemplates2/qquickpage.cpp @@ -117,6 +117,9 @@ QQuickPage::QQuickPage(QQuickItem *parent) Q_D(QQuickPage); setFlag(ItemIsFocusScope); setAcceptedMouseButtons(Qt::AllButtons); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif d->layout.reset(new QQuickPageLayout(this)); } diff --git a/src/quicktemplates2/qquickpageindicator.cpp b/src/quicktemplates2/qquickpageindicator.cpp index 92b6c0c0..b4c9c14c 100644 --- a/src/quicktemplates2/qquickpageindicator.cpp +++ b/src/quicktemplates2/qquickpageindicator.cpp @@ -247,7 +247,17 @@ void QQuickPageIndicator::setInteractive(bool interactive) return; d->interactive = interactive; - setAcceptedMouseButtons(interactive ? Qt::LeftButton : Qt::NoButton); + if (interactive) { + setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif + } else { + setAcceptedMouseButtons(Qt::NoButton); +#if QT_CONFIG(cursor) + unsetCursor(); +#endif + } emit interactiveChanged(); } diff --git a/src/quicktemplates2/qquickpane.cpp b/src/quicktemplates2/qquickpane.cpp index 6cb81316..efa85e0c 100644 --- a/src/quicktemplates2/qquickpane.cpp +++ b/src/quicktemplates2/qquickpane.cpp @@ -123,6 +123,9 @@ QQuickPane::QQuickPane(QQuickItem *parent) { setFlag(QQuickItem::ItemIsFocusScope); setAcceptedMouseButtons(Qt::AllButtons); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } QQuickPane::QQuickPane(QQuickPanePrivate &dd, QQuickItem *parent) @@ -130,6 +133,9 @@ QQuickPane::QQuickPane(QQuickPanePrivate &dd, QQuickItem *parent) { setFlag(QQuickItem::ItemIsFocusScope); setAcceptedMouseButtons(Qt::AllButtons); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } /*! diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp index 1c74f9ee..2d3c464f 100644 --- a/src/quicktemplates2/qquickrangeslider.cpp +++ b/src/quicktemplates2/qquickrangeslider.cpp @@ -521,8 +521,11 @@ QQuickRangeSlider::QQuickRangeSlider(QQuickItem *parent) d->first = new QQuickRangeSliderNode(0.0, this); d->second = new QQuickRangeSliderNode(1.0, this); - setAcceptedMouseButtons(Qt::LeftButton); setFlag(QQuickItem::ItemIsFocusScope); + setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } /*! diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index 8f4337ae..cb5c0001 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -196,9 +196,18 @@ void QQuickScrollBarPrivate::setInteractive(bool enabled) return; interactive = enabled; - q->setAcceptedMouseButtons(interactive ? Qt::LeftButton : Qt::NoButton); - if (!interactive) + if (interactive) { + q->setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + q->setCursor(Qt::ArrowCursor); +#endif + } else { + q->setAcceptedMouseButtons(Qt::NoButton); +#if QT_CONFIG(cursor) + q->unsetCursor(); +#endif q->ungrabMouse(); + } emit q->interactiveChanged(); } diff --git a/src/quicktemplates2/qquickslider.cpp b/src/quicktemplates2/qquickslider.cpp index 266f883f..fbf9755d 100644 --- a/src/quicktemplates2/qquickslider.cpp +++ b/src/quicktemplates2/qquickslider.cpp @@ -243,6 +243,9 @@ QQuickSlider::QQuickSlider(QQuickItem *parent) setActiveFocusOnTab(true); setFocusPolicy(Qt::StrongFocus); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } /*! diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index 657102c3..b70366ea 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -351,6 +351,9 @@ QQuickSpinBox::QQuickSpinBox(QQuickItem *parent) setFlag(ItemIsFocusScope); setFiltersChildMouseEvents(true); setAcceptedMouseButtons(Qt::LeftButton); +#if QT_CONFIG(cursor) + setCursor(Qt::ArrowCursor); +#endif } /*! @@ -470,6 +473,15 @@ void QQuickSpinBox::setEditable(bool editable) if (d->editable == editable) return; +#if QT_CONFIG(cursor) + if (d->contentItem) { + if (editable) + d->contentItem->setCursor(Qt::IBeamCursor); + else + d->contentItem->unsetCursor(); + } +#endif + d->editable = editable; emit editableChanged(); } @@ -905,11 +917,16 @@ void QQuickSpinBox::itemChange(ItemChange change, const ItemChangeData &value) void QQuickSpinBox::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) { + Q_D(QQuickSpinBox); if (QQuickTextInput *oldInput = qobject_cast(oldItem)) disconnect(oldInput, &QQuickTextInput::inputMethodComposingChanged, this, &QQuickSpinBox::inputMethodComposingChanged); if (newItem) { newItem->setActiveFocusOnTab(true); +#if QT_CONFIG(cursor) + if (d->editable) + newItem->setCursor(Qt::IBeamCursor); +#endif if (QQuickTextInput *newInput = qobject_cast(newItem)) connect(newInput, &QQuickTextInput::inputMethodComposingChanged, this, &QQuickSpinBox::inputMethodComposingChanged); -- cgit v1.2.3