不在编辑模式时如何隐藏插入符号?
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
,但也请尝试以下方法:
update()
项在交互后被禁用。
将 textCursor
设置为空游标,可能与 update()
.
结合使用
setTextCursor(QTextCursor());
在失去焦点时添加了明确的选择,因为似乎不仅留下了插入符号,而且任何选定的文本也都留下了选择 - 这不是我想要的行为。
void TextItem::focusOutEvent(QFocusEvent *event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::NoTextInteraction);
QTextCursor _cursor = textCursor();
_cursor.clearSelection();
setTextCursor(_cursor);
}
上面的操作清除了插入符号,以及任何选定的文本片段。
(如果阅读此问题的任何人希望在文本片段上保存选择,但不显示插入符号,我在问题中提到的选项 - 通过设置 QCursor
- 可能是最佳选择)
我有一个 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
,但也请尝试以下方法:
update()
项在交互后被禁用。将
结合使用textCursor
设置为空游标,可能与update()
.setTextCursor(QTextCursor());
在失去焦点时添加了明确的选择,因为似乎不仅留下了插入符号,而且任何选定的文本也都留下了选择 - 这不是我想要的行为。
void TextItem::focusOutEvent(QFocusEvent *event)
{
Q_UNUSED(event);
setTextInteractionFlags(Qt::NoTextInteraction);
QTextCursor _cursor = textCursor();
_cursor.clearSelection();
setTextCursor(_cursor);
}
上面的操作清除了插入符号,以及任何选定的文本片段。
(如果阅读此问题的任何人希望在文本片段上保存选择,但不显示插入符号,我在问题中提到的选项 - 通过设置 QCursor
- 可能是最佳选择)