QPlainText----信号

这篇博客介绍了如何在Qt环境中使用QPlainTextEdit组件处理文本编辑的信号,包括内容改变、选中内容改变、修改状态改变和光标位置改变的信号。同时,讨论了内容更新请求时的处理,特别是当文本内容过多时,通过滚轮滚动导致的显示内容更新。此外,还展示了如何在文本编辑器旁边显示行号,并实现滚动同步。
摘要由CSDN通过智能技术生成

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_())
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。七十二。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值