不在编辑模式时如何隐藏插入符号?

How can I hide the caret when not in edit mode?

我有一个 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);
}

单击退出时,文本不再可编辑 - 但插入符号仍然可见。

focusOutEvent 中添加 setCursor(Qt::OpenHandCursor);(并且可能试图记住要设置的光标形状...我还不知道怎么做)解决了这个问题 - 使插入符号消失 - 但我不要认为这是正确的解决方法。

然而,我在 QTextCursor 中找不到任何方法来在不再处于编辑模式时隐藏插入符号 - 似乎设置 NoTextInteraction 应该可以做到这一点...

不处于编辑模式时隐藏插入符号的最佳方法是什么?

您说的是插入符号 - 文本编辑位置的屏幕指示。您描述的内容看起来像 Qt 错误。

setCursor 调用修改了 鼠标指针 ,而不是插入符号。它有一个副作用,即强制项目将插入符号状态与交互标志同步。缺少这种同步是您遇到的错误。

QTextCursor class 不代表插入符号,而是文本文档中的一个位置。它是一个奇特的迭代器,与它的任何可见表示完全分离。

QGraphicsTextItem 碰巧维护了一个代表其 textCursor 属性 位置的插入符号。您可以让其他 QTextCursor 个实例在同一个文档上运行,并且它们不会有与之关联的可见插入符号 - 它们只是迭代器。

您知道该错误的一种解决方法 - 通过 setCursor,但也请尝试以下方法:

  1. update() 项在交互后被禁用。

  2. textCursor 设置为空游标,可能与 update().

    结合使用
    setTextCursor(QTextCursor());
    

在失去焦点时添加了明确的选择,因为似乎不仅留下了插入符号,而且任何选定的文本也都留下了选择 - 这不是我想要的行为。

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

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

上面的操作清除了插入符号,以及任何选定的文本片段。

(如果阅读此问题的任何人希望在文本片段上保存选择,但不显示插入符号,我在问题中提到的选项 - 通过设置 QCursor - 可能是最佳选择)