PyQt5 - 滚动到 QTextEdit 的光标

Posted

技术标签:

【中文标题】PyQt5 - 滚动到 QTextEdit 的光标【英文标题】:PyQt5 - Scroll to QTextEdit's cursor 【发布时间】:2017-09-04 15:31:10 【问题描述】:

我正在使用 PyQt5 开发一个文本编辑器,并且我正在实现“查找下一个...”功能。用户输入他想要搜索的字符串。每次他单击“查找下一个”按钮时,下一个匹配的字符串都会突出显示。

我已经像这样使用 QTextEdit.textCursor() 完成了:

...
textarea = QTextEdit()
cursor = textarea.textCursor()

#This function returns an array: [start index of the matched string, end index of the matched string]
matched_string_indexes = findText(text_to_find, text,...) 

#So now I can use setPosition to select the matched string
cursor.setPosition(array[0], QTextEdit.MoveAnchor)
cursor.setPosition(array[1], QTextEdit.KeepAnchor)

#Now that the matched string is seleted I can highlight it
highlightText(cursor) 

问题是如果匹配字符串位于页面底部(在视口之外),我希望文本区域自动向下(或向上)滚动。我尝试使用 QTextEdit 的 ensureCursorVisible() 方法,但它不起作用。

蛮力解决方案是以像素为单位计算当前行的 y 坐标,而不是使用 scrollbar.setValue() 方法滚动到该行。

【问题讨论】:

当然,您必须致电textarea.setTextCursor(cursor) 才能让ensureCursorVisible() 工作。 它工作了 omg... 我非常确定 QTextEdit.textCursor() 方法返回的光标必须“设置”为文本区域的光标。非常感谢。 【参考方案1】:

其实我只需要:

textarea.ensureCursorVisible()
#AND
textare.setTextCursor(cursor)

QTextEdit 的 textCursor() 方法返回其光标的副本,而不是真正的光标,因此我们必须使用 setTextCursor() 方法对其进行设置。

【讨论】:

我花了 3 个小时来找到这个解决方案。谢谢它工作正常!

以上是关于PyQt5 - 滚动到 QTextEdit 的光标的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 控件学习(一个一个学习之QPlainTextEdit)

无法在 Pyqt5 中更改 qtextedit 的背景边框,有啥建议吗?

如何清除pyqt5中qtextbrowser的内容?

pyqt5 QTextEdit Windows 10 ASCII 符号

python pyqt5 QTextEdit 多行文本框

怎样将qtextedit的光标移到最后