diff options
-rw-r--r-- | src/quick/items/qquicktext.cpp | 25 | ||||
-rw-r--r-- | tests/auto/quick/qquicktext/data/hover.qml | 22 | ||||
-rw-r--r-- | tests/auto/quick/qquicktext/tst_qquicktext.cpp | 28 |
3 files changed, 63 insertions, 12 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 6335c83b2b..d62bf8efa1 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -107,7 +107,6 @@ void QQuickTextPrivate::init() Q_Q(QQuickText); q->setAcceptedMouseButtons(Qt::LeftButton); q->setFlag(QQuickItem::ItemHasContents); - q->setAcceptHoverEvents(true); } QQuickTextDocumentWithImageResources::QQuickTextDocumentWithImageResources(QQuickItem *parent) @@ -1523,6 +1522,7 @@ void QQuickText::setText(const QString &n) qDeleteAll(d->imgTags); d->imgTags.clear(); d->updateLayout(); + setAcceptHoverEvents(d->richText || d->styledText); emit textChanged(d->text); } @@ -2002,6 +2002,7 @@ void QQuickText::setTextFormat(TextFormat format) d->determineHorizontalAlignment(); } d->updateLayout(); + setAcceptHoverEvents(d->richText || d->styledText); emit textFormatChanged(d->format); } @@ -2634,34 +2635,34 @@ void QQuickTextPrivate::processHoverEvent(QHoverEvent *event) { Q_Q(QQuickText); QString link; - if (event->type() != QEvent::HoverLeave) - link = anchorAt(event->posF()); + if (isLinkHoveredConnected()) { + if (event->type() != QEvent::HoverLeave) + link = anchorAt(event->posF()); - if ((!extra.isAllocated() && !link.isEmpty()) || (extra.isAllocated() && extra->hoveredLink != link)) { - extra.value().hoveredLink = link; - emit q->linkHovered(extra->hoveredLink); + if ((!extra.isAllocated() && !link.isEmpty()) || (extra.isAllocated() && extra->hoveredLink != link)) { + extra.value().hoveredLink = link; + emit q->linkHovered(extra->hoveredLink); + } } + event->setAccepted(!link.isEmpty()); } void QQuickText::hoverEnterEvent(QHoverEvent *event) { Q_D(QQuickText); - if (d->isLinkHoveredConnected()) - d->processHoverEvent(event); + d->processHoverEvent(event); } void QQuickText::hoverMoveEvent(QHoverEvent *event) { Q_D(QQuickText); - if (d->isLinkHoveredConnected()) - d->processHoverEvent(event); + d->processHoverEvent(event); } void QQuickText::hoverLeaveEvent(QHoverEvent *event) { Q_D(QQuickText); - if (d->isLinkHoveredConnected()) - d->processHoverEvent(event); + d->processHoverEvent(event); } QT_END_NAMESPACE diff --git a/tests/auto/quick/qquicktext/data/hover.qml b/tests/auto/quick/qquicktext/data/hover.qml new file mode 100644 index 0000000000..36d9b5c691 --- /dev/null +++ b/tests/auto/quick/qquicktext/data/hover.qml @@ -0,0 +1,22 @@ +import QtQuick 2.1 +import QtQuick.Window 2.1 + +Window { + width: 100 + height: 100 + property alias mouseArea: mouseArea + property alias textItem: textItem + MouseArea { + id: mouseArea + hoverEnabled: true + anchors.fill: parent + acceptedButtons: Qt.NoButton + property bool wasHovered: false + onPositionChanged: wasHovered = true + Text { + id: textItem + text: "plain text" + anchors.fill: parent + } + } +} diff --git a/tests/auto/quick/qquicktext/tst_qquicktext.cpp b/tests/auto/quick/qquicktext/tst_qquicktext.cpp index 6b93791545..78e03be9c2 100644 --- a/tests/auto/quick/qquicktext/tst_qquicktext.cpp +++ b/tests/auto/quick/qquicktext/tst_qquicktext.cpp @@ -44,6 +44,7 @@ #include <QtQml/qqmlengine.h> #include <QtQml/qqmlcomponent.h> #include <QtQuick/private/qquicktext_p.h> +#include <QtQuick/private/qquickmousearea_p.h> #include <private/qquicktext_p_p.h> #include <private/qquickvaluetypes_p.h> #include <QFontMetrics> @@ -151,6 +152,8 @@ private slots: void elideBeforeMaximumLineCount(); + void hover(); + private: QStringList standard; QStringList richText; @@ -3744,6 +3747,31 @@ void tst_qquicktext::elideBeforeMaximumLineCount() QCOMPARE(item->lineCount(), 2); } +void tst_qquicktext::hover() +{ // QTBUG-33842 + QQmlComponent component(&engine, testFile("hover.qml")); + + QScopedPointer<QObject> object(component.create()); + + QQuickWindow *window = qobject_cast<QQuickWindow *>(object.data()); + QVERIFY(window); + + QQuickMouseArea *mouseArea = window->property("mouseArea").value<QQuickMouseArea *>(); + QVERIFY(mouseArea); + QQuickText *textItem = window->property("textItem").value<QQuickText *>(); + QVERIFY(textItem); + + QVERIFY(!mouseArea->property("wasHovered").toBool()); + + QPoint center(window->width() / 2, window->height() / 2); + QPoint delta(window->width() / 10, window->height() / 10); + + QTest::mouseMove(window, center - delta); + QTest::mouseMove(window, center + delta); + + QVERIFY(mouseArea->property("wasHovered").toBool()); +} + QTEST_MAIN(tst_qquicktext) #include "tst_qquicktext.moc" |