QTextedit find () siempre devuelve False (pyside2)

Dec 10 2020

Quiero hacer una búsqueda y reemplazar en un QTextEdit pero QTextEdit.find () siempre devuelve False / no encuentra nada. ¿Dónde está mi error?

Aquí hay un ejemplo reproducible (muy) mínimo:

from PySide2.QtWidgets import QApplication, QTextEdit
from PySide2.QtGui import QTextCursor
import sys

app = QApplication(sys.argv)
textedit = QTextEdit()
cursor = textedit.textCursor()
cursor.insertText("test test test")
cursor.movePosition(QTextCursor.Start)
print(textedit.find("t"))
textedit.show()
app.exec_()

Gracias por eso -.-: "Esta pregunta ya tiene una respuesta aquí: QTextEdit.find () no funciona en Python"

Eso no es verdad. (Tal vez lea las preguntas y respuestas antes de decir algo así y cerrar las preguntas. Este es el comportamiento por el que stackoverflow tiene tan mala reputación): "El problema es la posición del cursor en la ventana. De forma predeterminada, la búsqueda solo se realiza hacia adelante (= desde la posición del cursor en adelante). Pero coloco el cursor en el inicio del documento mediante cursor.movePosition (QTextCursor.Start)

Respuestas

1 furas Dec 10 2020 at 22:12

Descubrí que textedit.textCursor()crea una copia local de la posición y no cambia la posición original en QTextEdit.

Tienes que actualizar la posición al QTextEditusar

textedit.setTextCursor(cursor) 

y luego find()encontrará primero tcomo espera.


from PySide2.QtWidgets import QApplication, QTextEdit
from PySide2.QtGui import QTextCursor
import sys

app = QApplication(sys.argv)

textedit = QTextEdit()

cursor = textedit.textCursor()   # get local copy
cursor.insertText("test test test")
cursor.movePosition(QTextCursor.Start)
textedit.setTextCursor(cursor)   # update it

#textedit.insertPlainText("test test test")
#textedit.moveCursor(QTextCursor.Start)

textedit.show()

print(textedit.find("t"))  # first `t`
print(textedit.find("t"))  # second `t`

app.exec_()