2022-07-16 09:37:59 +08:00
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
from PySide6 import QtCore, QtWidgets
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
QPlainText 案例:显示行号
|
|
|
|
|
每当文本文档需要更新显示矩形时,会发射updateRequest信号,垂直滚动量作为参数传出
|
|
|
|
|
利用这个信号,可以编写行号、断点等功能
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MyWidget(QtWidgets.QWidget):
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
self.setWindowTitle("QPlainTextEdit-显示行号")
|
|
|
|
|
self.resize(800, 600)
|
|
|
|
|
self.setup_ui()
|
|
|
|
|
self.show_line_num()
|
|
|
|
|
|
|
|
|
|
def setup_ui(self) -> None:
|
|
|
|
|
"""设置界面"""
|
|
|
|
|
|
|
|
|
|
self.pte = QtWidgets.QPlainTextEdit(self)
|
|
|
|
|
self.pte.resize(350, 400)
|
|
|
|
|
self.pte.move(150, 80)
|
|
|
|
|
self.pte.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) # 始终显示滚动条
|
|
|
|
|
|
|
|
|
|
# 用于限制line_num_label位置尺寸的父控件
|
|
|
|
|
line_num_widget = QtWidgets.QWidget(self)
|
|
|
|
|
line_num_widget.resize(30, 400)
|
|
|
|
|
line_num_widget.move(120, 80)
|
|
|
|
|
|
|
|
|
|
self.line_num_label = QtWidgets.QLabel(line_num_widget)
|
|
|
|
|
self.line_num_label.move(0, 5) # 微调,视觉上对齐
|
|
|
|
|
line_nums = "\n".join([str(i) for i in range(1, 101)]) # 生成行号文本
|
|
|
|
|
self.line_num_label.setText(line_nums)
|
|
|
|
|
|
|
|
|
|
def show_line_num(self) -> None:
|
|
|
|
|
"""显示行号"""
|
|
|
|
|
|
|
|
|
|
@QtCore.Slot(QtCore.QRect, int)
|
|
|
|
|
def scroll_line_num(_, dy: int): # 用_表示仅占位而不会用到的参数
|
2022-07-16 09:53:18 +08:00
|
|
|
|
self.line_num_label.move(self.line_num_label.x(), self.line_num_label.y() + dy)
|
2022-07-16 09:37:59 +08:00
|
|
|
|
|
|
|
|
|
self.pte.updateRequest.connect(scroll_line_num) # type: ignore
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
app = QtWidgets.QApplication(sys.argv)
|
|
|
|
|
window = MyWidget()
|
|
|
|
|
window.show()
|
|
|
|
|
sys.exit(app.exec())
|