Как я могу скрыть каретку, когда не в режиме редактирования?

У меня есть TextItem наследуя QGraphicsTextItem, Я сделал так, чтобы при двойном щелчке я мог редактировать текст, а при нажатии текст больше не редактировался.

void TextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event)
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    setFocus();

    int p = document()->documentLayout()->hitTest(event->pos(), Qt::FuzzyHit);
    QTextCursor _cursor = textCursor();
    _cursor.setPosition(p);
    setTextCursor(_cursor);
}

void TextItem::focusOutEvent(QFocusEvent *event)
{
    Q_UNUSED(event);
    setTextInteractionFlags(Qt::NoTextInteraction);
}

При нажатии текст больше не редактируется, но курсор все еще виден.

Добавление setCursor(Qt::OpenHandCursor); в focusOutEvent (и, возможно, попытка вспомнить, какую форму курсора установить... Я пока не знаю, как это исправить) - исправление каретки - но я не думаю, что это правильное решение.

Тем не менее я не могу найти какой-либо метод в QTextCursor скрыть каретку, когда больше не в режиме редактирования - и кажется, что настройка NoTextInteraction должен был сделать это...

Каков наилучший способ скрыть каретку, когда не в режиме редактирования?

2 ответа

Решение

Добавлен четкий выбор потерянного фокуса, поскольку кажется, что не только каретка осталась, но и любой выделенный текст также оставлен выбранным - и это не то поведение, которое я хотел.

void TextItem::focusOutEvent(QFocusEvent *event)
{
    Q_UNUSED(event);
    setTextInteractionFlags(Qt::NoTextInteraction);

    QTextCursor _cursor = textCursor();
    _cursor.clearSelection();
    setTextCursor(_cursor);
}

Вышеуказанное очищает курсор, а также любой выделенный фрагмент текста.

(Если кто-нибудь, читающий этот вопрос, хочет сохранить выделение на фрагментах текста, но не отображать каретку, я упомянул в своем вопросе опцию - установив QCursor - может быть лучший вариант)

Вы говорите о каретке - экранной индикации позиции редактирования текста. То, что вы описываете, выглядит как ошибка Qt.

setCursor Вызов изменяет указатель мыши, а не курсор. У него есть побочный эффект, который заставляет элемент синхронизировать состояние каретки с флагами взаимодействия. Отсутствие такой синхронизации - ошибка, с которой вы сталкиваетесь.

QTextCursor класс представляет не каретку, а позицию в текстовом документе. Это причудливый итератор, полностью отделенный от любого его видимого представления.

QGraphicsTextItem случается, чтобы сохранить каретку, которая представляет позицию его textCursor имущество. Вы можете иметь другие QTextCursor экземпляры, работающие с одним и тем же документом, и у них не будет связанной с ними видимой каретки - они просто итераторы.

Вы знаете один обходной путь для ошибки - через setCursor, но попробуйте те, что ниже:

  1. update() предмета после того, как взаимодействие было отключено.

  2. Настройка textCursor на нулевой курсор, возможно, в сочетании с update(),

    setTextCursor(QTextCursor());
    
Другие вопросы по тегам