2017-04-09 202 views
1

我正在致力於Frescboaldi,一個PyQt5應用程序並遇到與核心文本編輯組件交互的問題。在PyQt5文本編輯中移動光標不起作用

看來無論我嘗試我不能得到或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的問題?

[編輯:]我現在已經證實了一個最小的應用程序示例,該問題不能在更大的應用程序構造中。在下面的迷你應用程序既不也不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() 

回答

1

您正在通過w.textCursor返回文本光標的本地副本。您應該在末尾調用w.setTextCursor(cursor)以更改可見光標。

的第二個問題是,您使用的movePosition輸出再次打電話movePosition,這是不允許的:

cursor.movePosition(cursor.movePosition(cursor.Left, cursor.KeepAnchor, 3)) 

應該是我在Qt中測試了它

cursor.movePosition(cursor.Left, cursor.KeepAnchor, 3) 

注(不PyQt),但這不應該有任何區別,它們成功選擇了Hello worldlo

+0

我不確定這是否正確。如果我這樣做的話,那麼插入符號就會被放置在開頭,沒有任何選擇。 *和* insertText()* does *正常工作的事實似乎與此相矛盾。據我所知,'setTextCursor'只能用於*改變文本編輯的光標到另一個或新的光標 –

+0

'insertText'不會改變光標,而是改變文本的文本編輯。你想改變textCursor(的位置),所以你需要像文檔中所說的那樣調用'setTextCursor'。請注意,您刪除了嵌套的'movePosition'。 – m7913d

+0

好的,我明白了。根據movePosition的事情:我不知道這個令人尷尬的複製和粘貼錯誤是如何滑過... –