Как я могу скрыть каретку, когда не в режиме редактирования?
У меня есть 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
, но попробуйте те, что ниже:
update()
предмета после того, как взаимодействие было отключено.Настройка
textCursor
на нулевой курсор, возможно, в сочетании сupdate()
,setTextCursor(QTextCursor());