Reputation: 27
I've been looking a lot on the web how to make the line break option in a QtextEdit however I have not been successful. I could see what I'm looking for in an answer Move Cursor Line Position QTextEdit
but when I want to do the same I don't get the same result and I can't find an explanation, here is my code
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication,QLineEdit,QPushButton,QTextEdit
from PyQt5.QtGui import QTextCharFormat, QBrush, QColor, QTextCursor
from PyQt5.QtCore import QRegExp
class VentanaFindText(QMainWindow):
def __init__(self):
super(VentanaFindText, self).__init__()
self.setWindowTitle("find text - QTextEdit")
self.resize(475,253)
self.line_buscar = QLineEdit(self)
self.line_buscar.setGeometry(20,20,365,23)
self.btn_buscar = QPushButton("buscar",self)
self.btn_buscar.setGeometry(388,20,75,25)
self.text_edit = QTextEdit(self)
self.text_edit.setGeometry(20, 50, 441, 191)
self.btn_buscar.clicked.connect(self.gotoLine)
def gotoLine(self):
print("go to line")
n = int(self.line_buscar.text())
cursor = QTextCursor(self.text_edit.document().findBlockByLineNumber(n))
self.text_edit.setTextCursor(cursor)
if __name__ == '__main__':
app = QApplication(sys.argv)
ventana = VentanaFindText()
ventana.show()
sys.exit(app.exec_())
Upvotes: 1
Views: 930
Reputation: 243887
The problem is that findBlockByLineNumber()
returns a valid QTextBlock
if the line number is less than the number of lines in the text, and at the beginning the QTextEdit is empty so it will fail. One possible solution is to add end-lines "\n" until the number of lines is obtained.
import sys
from PyQt5.QtWidgets import (
QMainWindow,
QApplication,
QLineEdit,
QPushButton,
QTextEdit,
QGridLayout,
QWidget,
)
from PyQt5.QtGui import QTextCursor
class VentanaFindText(QMainWindow):
def __init__(self):
super(VentanaFindText, self).__init__()
self.setWindowTitle("find text - QTextEdit")
self.resize(475, 253)
self.line_buscar = QLineEdit()
self.btn_buscar = QPushButton("buscar",)
self.text_edit = QTextEdit()
central_widget = QWidget()
self.setCentralWidget(central_widget)
grid_layout = QGridLayout(central_widget)
grid_layout.addWidget(self.line_buscar, 0, 0)
grid_layout.addWidget(self.btn_buscar, 0, 1)
grid_layout.addWidget(self.text_edit, 1, 0, 1, 2)
self.btn_buscar.clicked.connect(self.gotoLine)
def gotoLine(self):
text = self.line_buscar.text()
try:
n = int(text)
except ValueError:
print("Cannot convert '{}' to integer number".format(text))
else:
if n < 1:
print("The number must be greater than 1")
return
doc = self.text_edit.document()
self.text_edit.setFocus()
if n > doc.blockCount():
self.text_edit.insertPlainText("\n" * (n - doc.blockCount()))
cursor = QTextCursor(doc.findBlockByLineNumber(n - 1))
self.text_edit.setTextCursor(cursor)
if __name__ == "__main__":
app = QApplication(sys.argv)
ventana = VentanaFindText()
ventana.show()
sys.exit(app.exec_())
Upvotes: 3