AbelJM
AbelJM

Reputation: 27

pyqt5 goto line Qtextedit

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

Answers (1)

eyllanesc
eyllanesc

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

Related Questions