PyQt5 QTextEdit实现行号标注

QTextEdit行号同步滚动
本文介绍了一种在PyQt5中使用QTextEdit组件时,如何实现行号区域与文本编辑区域同步滚动的方法。通过监听滚动事件并计算光标位置进行补偿,确保滚动行数精确对齐。此外,还实现了高亮当前行的功能。

原控件是QPlainTextEdit
移植到了QTextEdit上
使用了借助光标位置进行补偿的方式,来保证滚动行数精确满足要求。

from PyQt5.QtCore import Qt, QRect, QSize, QPoint
from PyQt5.QtWidgets import QWidget, QPlainTextEdit, QTextEdit
from PyQt5.QtGui import QColor, QPainter, QTextFormat, QKeyEvent, QWheelEvent, QMouseEvent, QTextCursor


class QLineNumberArea(QWidget):
    def __init__(self, editor):
        super().__init__(editor)
        self.codeEditor = editor

    def sizeHint(self):
        return QSize(self.editor.lineNumberAreaWidth(), 0)

    def paintEvent(self, event):
        print('paint!!!!!')
        self.codeEditor.lineNumberAreaPaintEvent(event)


class QCodeEditor(QTextEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.lineNumberArea = QLineNumberArea(self)
        self.setText('aa\n' * 20)
        self.document().blockCountChanged.connect(self.updateLineNumberAreaWidth)
        self.document().cursorPositionChanged.connect(self.highlightCurrentLine)
        self.verticalScrollBar().sliderMoved.connect(self.on_scroll)
        # self.verticalScrollBar().sliderPressed.connect(self.on_scroll)
        self.verticalScrollBar().sliderReleased.connect(self.on_scroll)
        # self.verticalScrollBar(
        # self.verticalScrollBar().sliderMoved.connect(self.on_scroll)
        # self.verticalScrollBar().act
        #    
PyQt5 中,`QTextEdit` 提供了多种信号(signal),可以用于响应用户的操作,例如文本内容的变化、光标位置的改变、文本被选中等。要将这些信号连接到自定义的函数(槽函数),可以通过 `connect()` 方法实现。以下是常见的 `QTextEdit` 信号及其使用方式: - `textChanged()`:当文本内容发生变化时触发。这包括用户输入、删除或程序修改文本内容。 ```python ui.textEdit.textChanged.connect(on_text_changed) ``` - `cursorPositionChanged()`:当光标位置发生变化时触发,例如用户点击或使用键盘移动光标。 ```python ui.textEdit.cursorPositionChanged.connect(on_cursor_position_changed) ``` - `selectionChanged()`:当选中的文本发生变化时触发。 ```python ui.textEdit.selectionChanged.connect(on_selection_changed) ``` 每个信号都可以绑定到一个自定义函数,从而实现特定的逻辑处理。例如,`on_text_changed` 函数可以用于实时更新状态栏或执行文本分析[^1]。 以下是一个完整的示例代码,展示如何将 `QTextEdit` 的信号连接到函数: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QLabel, QVBoxLayout, QWidget class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("QTextEdit Signal Example") self.setGeometry(100, 100, 400, 300) # 创建 QTextEdit 控件 self.text_edit = QTextEdit(self) # 创建 QLabel 用于显示信息 self.label = QLabel("Text changes will be shown here", self) # 设置布局 layout = QVBoxLayout() layout.addWidget(self.text_edit) layout.addWidget(self.label) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) # 连接 textChanged 信号到槽函数 self.text_edit.textChanged.connect(self.on_text_changed) def on_text_changed(self): # 获取当前文本长度 current_text = self.text_edit.toPlainText() self.label.setText(f"Current text length: {len(current_text)}") ``` 在上述示例中,每当用户在 `QTextEdit` 中输入或修改文本时,`on_text_changed` 函数会被调用,并更新标签中显示的文本长度。 ### 信号与槽机制的优势 - **灵活性**:可以将多个信号连接到同一个槽函数,也可以将一个信号连接到多个槽函数。 - **解耦性**:信号和槽机制使得控件与业务逻辑之间的耦合度降低,便于维护和扩展。 在 PyQt5 的代码中,信号与槽的连接方式通常采用 `widget.signal.connect(slot_function)` 的形式,这种方式简单直观,并且适用于大多数控件,包括 `QTextEdit` [^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值