Pyqt4 如何控制 QPlainTextEdit 光标跳转至指定行号的位置

Pyqt4 如何控制 QPlainTextEdit 光标跳转至指定行号的位置

1 回复

import sys
from PyQt4 import QtGui, QtCore

class TextEditor(QtGui.QWidget):
    def __init__(self):
        super(TextEditor, self).__init__()
        self.initUI()
        
    def initUI(self):
        # 创建文本编辑框
        self.text_edit = QtGui.QPlainTextEdit()
        self.text_edit.setPlainText("第1行\n第2行\n第3行\n第4行\n第5行\n第6行\n第7行\n第8行\n第9行\n第10行")
        
        # 创建跳转按钮和行号输入框
        self.line_input = QtGui.QLineEdit()
        self.jump_btn = QtGui.QPushButton("跳转到行")
        self.jump_btn.clicked.connect(self.jump_to_line)
        
        # 布局
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.text_edit)
        
        h_layout = QtGui.QHBoxLayout()
        h_layout.addWidget(QtGui.QLabel("行号:"))
        h_layout.addWidget(self.line_input)
        h_layout.addWidget(self.jump_btn)
        
        layout.addLayout(h_layout)
        self.setLayout(layout)
        self.setWindowTitle('QPlainTextEdit 光标跳转示例')
        self.resize(400, 300)
    
    def jump_to_line(self):
        try:
            # 获取输入的行号
            line_num = int(self.line_input.text()) - 1  # 转换为0-based索引
            
            # 获取文档对象
            document = self.text_edit.document()
            
            # 检查行号是否有效
            if 0 <= line_num < document.lineCount():
                # 获取指定行的文本块
                block = document.findBlockByLineNumber(line_num)
                
                # 创建光标并定位
                cursor = QtGui.QTextCursor(block)
                self.text_edit.setTextCursor(cursor)
                
                # 确保光标所在行可见
                self.text_edit.centerCursor()
            else:
                QtGui.QMessageBox.warning(self, "警告", f"行号超出范围 (1-{document.lineCount()})")
                
        except ValueError:
            QtGui.QMessageBox.warning(self, "警告", "请输入有效的行号")

def main():
    app = QtGui.QApplication(sys.argv)
    editor = TextEditor()
    editor.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

核心原理是通过QTextDocument.findBlockByLineNumber()获取指定行的文本块,然后用QTextCursor定位到该块。注意行号索引从0开始,所以用户输入的行号需要减1。centerCursor()确保目标行在视口中可见。

简单说就是获取文档块再移动光标。

回到顶部