diff options
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 12 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 9 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp | 2 |
3 files changed, 19 insertions, 4 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 2f2fc0d4c1..8237ad10e4 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -1436,6 +1436,11 @@ void QQuickTextEdit::setReadOnly(bool r) emit readOnlyChanged(r); if (!d->selectByKeyboardSet) emit selectByKeyboardChanged(!r); + if (r) { + setCursorVisible(false); + } else if (hasActiveFocus()) { + setCursorVisible(true); + } } bool QQuickTextEdit::isReadOnly() const @@ -1937,9 +1942,9 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData * std::sort(d->textNodeMap.begin(), d->textNodeMap.end(), &comesBefore); } - if (d->cursorComponent == 0 && !isReadOnly()) { + if (d->cursorComponent == 0) { QSGRectangleNode* cursor = 0; - if (d->cursorVisible && d->control->cursorOn()) + if (!isReadOnly() && d->cursorVisible && d->control->cursorOn()) cursor = d->sceneGraphContext()->createRectangleNode(d->control->cursorRect(), d->color); rootNode->resetCursorNode(cursor); } @@ -2408,7 +2413,8 @@ void QQuickTextEditPrivate::handleFocusEvent(QFocusEvent *event) { Q_Q(QQuickTextEdit); bool focus = event->type() == QEvent::FocusIn; - q->setCursorVisible(focus); + if (!q->isReadOnly()) + q->setCursorVisible(focus); control->processEvent(event, QPointF(-xoff, -yoff)); if (focus) { q->q_updateAlignment(); diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 54da9a40d0..a4c61209f2 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -662,6 +662,12 @@ void QQuickTextInput::setReadOnly(bool ro) q_canPasteChanged(); d->emitUndoRedoChanged(); emit readOnlyChanged(ro); + if (ro) { + setCursorVisible(false); + } else if (hasActiveFocus()) { + setCursorVisible(true); + } + update(); } /*! @@ -2606,7 +2612,8 @@ void QQuickTextInputPrivate::handleFocusEvent(QFocusEvent *event) { Q_Q(QQuickTextInput); bool focus = event->gotFocus(); - q->setCursorVisible(focus); + if (!m_readOnly) + q->setCursorVisible(focus); if (focus) { q->q_updateAlignment(); #ifndef QT_NO_IM diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index b8eee9ce21..88cac92864 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -3192,6 +3192,7 @@ void tst_qquicktextinput::readOnly() QVERIFY(input != 0); QTRY_VERIFY(input->hasActiveFocus() == true); QVERIFY(input->isReadOnly() == true); + QVERIFY(input->isCursorVisible() == false); QString initial = input->text(); for (int k=Qt::Key_0; k<=Qt::Key_Z; k++) simulateKey(&window, k); @@ -3204,6 +3205,7 @@ void tst_qquicktextinput::readOnly() input->setReadOnly(false); QCOMPARE(input->isReadOnly(), false); QCOMPARE(input->cursorPosition(), input->text().length()); + QVERIFY(input->isCursorVisible() == true); } void tst_qquicktextinput::echoMode() |