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()确保目标行在视口中可见。
简单说就是获取文档块再移动光标。

