【问题标题】:How can I hide the caret when not in edit mode?不处于编辑模式时如何隐藏插入符号?
【发布时间】:2015-11-22 06:43:59
【问题描述】:

我有一个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 text-editor qgraphicsitem qgraphicstextitem


    【解决方案1】:

    您正在谈论插入符号 - 文本编辑位置的屏幕指示。你所描述的看起来像一个 Qt 错误。

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

    QTextCursor 类不代表插入符号,而是文本文档中的一个位置。这是一个花哨的迭代器,与它的任何可见表示完全解耦。

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

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

    1. 禁用交互后项目的update()

    2. textCursor 设置为空游标,可能与update() 结合使用。

      setTextCursor(QTextCursor());
      

    【讨论】:

    • 单独的update() 似乎没有效果......虽然选项2使我无法在以下双击时再次编辑文本。也许我会尝试将光标存储在类中......虽然它看起来比存储光标形状更复杂和“重量级”。
    • 因为似乎还有一个剩余的选择 - 我想如果我清除选择,插入符号也会被清除。成功了!
    【解决方案2】:

    在失去焦点时添加了一个清晰的选择,因为看起来不仅插入符号被选中,而且任何选定的文本也被选中 - 这不是我想要的行为。

    void TextItem::focusOutEvent(QFocusEvent *event)
    {
        Q_UNUSED(event);
        setTextInteractionFlags(Qt::NoTextInteraction);
    
        QTextCursor _cursor = textCursor();
        _cursor.clearSelection();
        setTextCursor(_cursor);
    }
    

    以上内容清除插入符号以及任何选定的文本片段。

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

    【讨论】:

    • 你可以保存选择,然后清除它,然后恢复它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2010-09-22
    相关资源
    最近更新 更多