我为Frescboaldi贡献了一个PyQt5应用程序,并遇到与核心文本编辑组件交互的问题。
无论我尝试什么,我都无法使setPosition
或movePosition
工作。
代码
cursor.insertText("Hello")
cursor.setPosition(cursor.position() - 5)
在文档中正确插入文本Hello
,但将光标留在插入文本的末尾(而不是将其向左移动5个字符)。第一行证明光标,textedit和文档已正确设置。尝试movePosition
也没有任何效果。
实际目标是插入一些文本,选择它并将光标放在选择的末尾,如https://github.com/wbsoft/frescobaldi/blob/master/frescobaldi_app/cursortools.py#L179
中所示我在这里做错了吗?这可能是Qt / PyQt中的错误吗?或者这可能是PyQt 5 中的问题?
[编辑:]我现在已经确认了一个最小的应用示例,问题可能出现在应用程序的较大构造中。在以下迷你应用中,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()
答案 0 :(得分:1)
您正在处理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
。