1、信号:文本改变时、选中文本内容发生改变时、编辑的状态发生改变时等。
内容更新请求时:即该文本编辑器的页面显示的内容过多时,通过滚轮跳转修改页面内容,则会发生请求。
self.pte.modificationChanged.connect(lambda val: print("修改状态发生了改变",val))
该信号会像外界传递一个参数,需要打印出参数。(一开始处于未编辑状态,当输入内容之后文本内容发生改变),尝试删除内容之后后,无任何反应,当我们撤回所有内容之后,显示修改状态发生改变,False。
输很多内容的时候,从文本没有编辑状态变成已经被编辑被修改状态;将所有内容删除,不可能在变回去;但撤销相当于将之前的操作回退回去,就变成False。
def 信号的操作(self):
self.pte.textChanged.connect(lambda: print("内容发生了改变"))
self.pte.selectionChanged.connect(lambda: print("选中的内容发生了改变",
self.pte.textCursor().selectedText()))
很好的去控制和给用户提供编辑状态。
def 信号的操作(self):
# 他会像外界传递一个参数,输入内容,文本从未修改变为修改
self.pte.modificationChanged.connect(lambda val: print("修改状态发生了改变",val))
# 获取文本文档对象
doc = self.pte.document()
# 修改设置编辑状态,改变编辑状态
# 通过这种方法提示文件是否需要带*
doc.setModified(False)
光标位置发生改变,并未传递任何参数。
块的个数发生改变时:
def 信号的操作(self):
# self.pte.textChanged.connect(lambda: print("内容发生了改变"))
self.pte.cursorPositionChanged.connect(lambda: print("光标位置发生改变"))
self.pte.blockCountChanged.connect(lambda bc: print("块的个数发生改变", bc))
重做:指撤销之后才能重做。
2、内容更新请求:当内容发生更新时,发射的信号,并且会像外界传递两个参数(更新的区域,y轴的位移(垂直方向移动的像素点),会展示文本内容每一行对应的行号)。
在整个文本框右侧写上行号,当整个文本框内容发生改变时,左侧行号也随之变化。
方案一:在左侧添加标签,标签中展示对应的行号;但是这种情况如果有几百行,标签高度会超过整个文本编辑器的高度,超出部分应该被隐藏。
在左侧添加一个父控件,父控件的内部添加标签,标签内部可能很长,但他超过控件范围的数据无法看清。当右侧文本数据滚动时,左侧也会随机变化。
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QPlainEdit的学习")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
pte = QPlainTextEdit(self)
pte.resize(300, 300)
pte.move(100, 100)
self.pte = pte
test_btn = QPushButton(self)
test_btn.move(20, 20)
test_btn.setText("测试按钮")
test_btn.clicked.connect(self.btn_test)
# 展示行号,先创建一个控件
line_num_parent = QWidget(self)
line_num_parent.resize(30, 300)
line_num_parent.move(70, 100)
line_num_parent.setStyleSheet("background-color:cyan")
self.line_label = QLabel(line_num_parent)
self.line_label.move(0, 2)
# 1--100
# 标签内部不支持竖着排,软换行情况则需要动态调整左侧标签
line_nums = "\n".join([str(i) for i in range(1, 101)])
self.line_label.setText(line_nums)
self.line_label.adjustSize()
def btn_test(self):
self.信号的操作()
def 信号的操作(self):
self.pte.updateRequest.connect(lambda rect, dy:self.line_label.move
(self.line_label.x(), self.line_label.y() + dy))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.resize(500, 500)
window.show()
sys.exit(app.exec_())