pyqt5 转到行 Qtextedit

pyqt5 goto line Qtextedit

我在网上看了很多如何在 QtextEdit 中设置换行符选项,但是我没有成功。 我可以在答案中看到我要找的东西 Move Cursor Line Position QTextEdit

但是当我想做同样的事情时,却没有得到相同的结果,而且我找不到解释,这是我的代码

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_())

问题是 findBlockByLineNumber() returns 如果行号小于文本中的行数,则有效 QTextBlock,并且在开始时 QTextEdit 是空的,所以它会失败。一种可能的解决方案是添加结束行“\n”,直到获得行数。

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_())