在 dropEvent 之后在 QTextEdit 中重新建立游标的预期行为

Reestablishing expected behavior of cursor in QTextEdit following a dropEvent

提问人:dde 提问时间:1/9/2023 最后编辑:dde 更新时间:1/10/2023 访问量:39

问:

我编写了一个类 CustomTextEdit,它继承自 qTextEdit 并覆盖以下两种方法:

  • bool canInsertFromMimeData(const QMimeData *source) const override;
  • void dropEvent(QDropEvent *e) override;

这样就可以将小组件用作拖放操作的目标。

这会对此小组件中的文本光标的行为产生意想不到的后果。

在 任何 之前,可以直观地看到文本光标的放置位置。 文本光标位置移动到鼠标单击的最后一个位置。 这是游标的预期行为。dropEvent

执行 之后,文本光标的垂直条呈现 保持在插入文本之后的位置。文本光标不再移动到该位置 在该区域的最后一次点击。dropEventQTextEdit

如果执行其他 s,最终可能会显示多个垂直条。dropEvent

在以下时间后重新建立文本光标的默认行为的正确过程是什么 执行 ?dropEvent

甚至该方法的以下定义也会产生这种奇怪的行为:dropEvent

void CustomTextEdit::dropEvent(QDropEvent *e)
{
    this->insertPlainText(QString("<<dropped text>>"));
}
QT q文本编辑

评论

0赞 hyde 1/10/2023
您是否尝试过简单地调用触发重绘?因为这听起来像是绘图故障。update()
0赞 dde 1/10/2023
我没有尝试过这个。但不幸的是,这并不能解决我的问题。

答:

1赞 dde 1/10/2023 #1

解决方案是在插入文本之前显式设置文本光标,并在父类上调用该方法。dropEventQTextEdit

void CustomTextEdit::dropEvent(QDropEvent *e)
{
    // setting the text cursor
    QTextCursor cursor = this->textCursor();
    cursor.setPosition(cursorForPosition(e->pos()).position());
    this->setTextCursor(cursor);
    // dropping the text
    this->insertPlainText(QString("<<dropped text>>"));
    // conclude the call by calling the parent method
    QTextEdit::dropEvent(e);
}