我正在为 Frescboaldi(一个 PyQt5 应用程序)做出贡献,并且在与核心文本编辑组件交互时遇到问题。
似乎无论我尝试什么,我都无法让
setPosition
或 movePosition
工作。
代码
cursor.insertText("Hello")
cursor.setPosition(cursor.position() - 5)
在文档中正确插入文本
Hello
,但将光标保留在插入文本的末尾(而不是向左移动 5 个字符)。第一行证明光标、文本编辑和文档设置正确。尝试movePosition
也没有任何效果。
实际目标是插入一些文本,选择它并将光标放在选择的末尾,如 https://github.com/wbsoft/frescobaldi/blob/master/frescobaldi_app/cursortools.py# 所示L179
我在这里做错了什么吗?这可能是 Qt/PyQt 中的错误吗?或者这可能是 PyQt5 中的问题吗?
[编辑:]我现在已经通过一个最小的应用程序示例确认问题不可能出现在应用程序的较大结构中。在以下迷你应用程序中,
setPosition
和movePosition
都没有任何效果 - 而insertText
效果很好:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QTextEdit
def main():
app = QApplication(sys.argv)
w = QTextEdit()
w.setWindowTitle('Manipulate cursor')
cursor = w.textCursor()
cursor.insertText("Hello World")
# neither of the following commands have any effect
cursor.setPosition(cursor.position() - 5)
cursor.movePosition(cursor.movePosition(cursor.Left, cursor.KeepAnchor, 3))
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
您正在处理由 w.textCursor 返回的文本光标的本地副本。您应该在最后调用
w.setTextCursor(cursor)
来更改可见光标。
第二个问题是你使用
movePosition
的输出再次调用movePosition
,这是不允许的:
cursor.movePosition(cursor.movePosition(cursor.Left, cursor.KeepAnchor, 3))
应该是
cursor.movePosition(cursor.Left, cursor.KeepAnchor, 3)
请注意,我在 Qt(不是 PyQt)中测试了它,但这应该没有任何区别,成功选择了
lo
的 Hello world
。
你可以使用这个剪辑
cursor = self.ui.textEdit_output.textCursor()
cursor.setPosition(0)
self.ui.textEdit_output.setTextCursor(cursor)