1

我有一个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应该做到这一点......

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

4

2 回答 2

1

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

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

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

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

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

于 2015-08-27T21:43:35.813 回答
1

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

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

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

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

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

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

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

    setTextCursor(QTextCursor());
    
于 2015-08-27T21:14:08.000 回答