在PyQt5文本编辑中移动光标不起作用

时间:2017-04-09 08:46:09

标签: qt pyqt qt5 pyqt5

我为Frescboaldi贡献了一个PyQt5应用程序,并遇到与核心文本编辑组件交互的问题。

无论我尝试什么,我都无法使setPositionmovePosition工作。

代码

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 中的问题?

[编辑:]我现在已经确认了一个最小的应用示例,问题可能出现在应用程序的较大构造中。在以下迷你应用中,setPositionmovePosition都没有任何效果 - 而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()

1 个答案:

答案 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