QTextedit find () sempre retorna False (pyside2)

Dec 10 2020

Eu quero fazer alguma pesquisa e substituir em um QTextEdit, mas QTextEdit.find () sempre retorna False / não encontra nada. Onde está meu erro?

Aqui está um exemplo reproduzível (muito) 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_()

Obrigado por isso -.-: "Esta questão já tem uma resposta aqui: QTextEdit.find () não funciona em Python"

Isso não é verdade. (Leia as perguntas e respostas antes de dizer algo assim e encerrar as perguntas. Este é o comportamento do motivo pelo qual stackoverflow tem uma reputação tão ruim.): "O problema é a posição do cursor na janela. Por padrão, a pesquisa só acontece para a frente (= da posição do cursor em diante). Mas eu defino meu cursor para o início do documento via cursor.movePosition (QTextCursor.Start)

Respostas

1 furas Dec 10 2020 at 22:12

Descobri que isso textedit.textCursor()cria uma cópia local da posição e não altera a posição original no QTextEdit.

Você tem que atualizar a posição QTextEditusando

textedit.setTextCursor(cursor) 

e então find()encontrará primeiro tcomo você 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_()