QPlainTextEdit可以说是一个简化版的QTextEdit类控件,和QTextEdit的功能差不多,使用了QTextEdit和QTextDocument作为背后实现的技术支撑。

由于QPlainTextEdit在文档中使用QPlainTextDocumentLayout的简化布局,它的性能要优于QTextEdit。(同样反过来可以说效果要略于QTextEdit)我们可以看一个这样的现象

左边的是QTextEdit,右边的是QPlainTextEdit,注意看文本框上沿,QTextEdit的是不是没有完全显示出来?对了!这就是由于QPlainTextEdit是用逐行逐段滚动的方法替代了像素精准度高的滚动方法,所以效率要更高一些(每次滚动都需要重新的绘制)在处理大批量的文本内容有比较强大的优势。

QPlainTextEdit类的父类是QABstractScrollArea类,和QTextEdit不属于从属结构的。

一功能作用

QPlainTextEdit的功能作用和QTextEdit基本一致,我们大概过一遍

1.构造函数

qte = QPlainTextEdit(window)
qte = QPlainTextEdit('字符',window)

2.提示占位文本

QPlainTextEdit.setPlaceholderText('占位文本')
QPlainTextEdit.placeholderText()

3.只读模式(只对用户只读,但可以通过代码修改)

QPlainTextEdit.setReadOnly()
QPlainTextEdit.isReadOnly()

4.格式

QPlainTextEdit.setCurrentCharFormat(QTextCharFormat)     #格式设定
QPlainTextEdit.mergeCurrentCharFormat(QTextCharFormat) #格式合并
QPlainTextEdit.currentCharFormat() #格式获取——>QTextCharFormat

5.软换行模式

QPlainTextEdit的软换行模式比QTextEdit的枚举值要少得多,只限定了是否限用软换行(默认情况时启用软换行的,即字符超出控件宽度后直接换行)

QPlainTextEdit.setLineWrapMode(QPlainTextEdit.NoWrap)
QPlainTextEdit.lineWrapMode()
#枚举值
QPlainTextEdit.NoWrap #不换行——0
QPlainTextEdit.WidgetWidth #按宽度换行——1

6.覆盖模式

QPlainTextEdit.setOverwriteMode(True)
QPlainTextEdit.overwriteMode()

但这里有个现象不知道是不是源代码里的bug,可以试一试:

启用覆盖模式,在文本框中输入1234567,把光标移动到3处,可以发现3是被光标覆盖的,这时候输入中文,可以发现3并没有被覆盖,和插入的效果一样

并且还可以试一试输入中文后在用中文覆盖,也是没有覆盖效果的,但是可以用非中文的字符覆盖中文(中文的标点不可以)。

7.Tab键控制

QPlainTextEdit.setTabChangesFocus()
QPlainTextEdit.setTabStopWidth()
QPlainTextEdit.tabChangesFocus()
QPlainTextEdit.tabStopWidth()

可以强制用Tab键切换焦点,或者定义Tab键的缩进距离。

8.文本操作

a.普通文本的操作

QPlainTextEdit.setPlainText()       #设置普通文本
QPlainTextEdit.insertPlainText() #插入普通文本
QPlainTextEdit.appendPlainText() #追加普通文本

插入是在光标位置插入,而追加不考虑光标位置,直接在最后端插入文本(另起一个段落)

b.富文本

QPlainTextEdit.appendHtml()         #追加Html标签

这里添加的Html标签只能是最简单的标签,不支持表格、列表图片等。

c.文本的获取

QPlainTextEdit.toPlainText()        #获取文本

这里获取的文本是从文本框里看到的文本,如果是Html标签并不会显示源代码

pte.appendHtml("<a herf='http://www.cngba.com'>博客园</a>")
print(pte.toPlainText())

打印出来的结果就是“博客园”。

9.块操作

QPlainTextEdit.blockCount()              #获取当前块的个数
QPlainTextEdit.setMaximumBlockCount() #设置最多的块个数
QPlainTextEdit.maximumBlockCount() #获取块的数量限定值

块就是在文本框中的段落的个数。默认值为0,即为不做限制。当给出限定值后,超出了限定值会把最上面的段落顶没了(是真的没了而不是不显示)

10.常用操作

QPlainTextEdit.selectAll()
QPlainTextEdit.copy()
QPlainTextEdit.paste()
QPlainTextEdit.cut()
QPlainTextEdit.clear()
QPlainTextEdit.redo()
QPlainTextEdit.undo()
QPlainTextEdit.find()
#搜索枚举值
QTextDocument.FindBackward #向前搜索
QTextDocument.FindCaseSensitively #区分大小写
QTextDocument.FindWholeWords #匹配完整单词

这些用法按名字就能了解,还有一个缩放的功能要单独提一下

QPlainTextEdit.zoomIn(int)   #缩放

int如果大于0,就是放大,而小于0就是缩小。

11.滚动

在处理比较大的文本的时候,有可能光标离开当前显示的页面,我们可以用滚动的方法,让光标显示在文本块的中间(一般都是配合一个按钮,这里就放出来槽函数就行了)

def fun():
pte.centerCursor()
pte.setFocus()

当点击了按钮,光标所在的行会尽可能的滚动到页面中间。这里说尽可能,是因为如果光标原先在第一行货最后一行,第一行放在中间前面是会留白的,肯定不现实,但是如果加上这句代码就可以使最后一行显示在文本框中间

pte = QPlainTextEdit(window)
pte.setCenterOnScroll(True)

注意是在声明控件的时候就要定义了,而不是在槽函数里(虽然没什么影响,但一般不这么用,否则需要在每个槽函数里都定义)。加了这句代码,就可以使文档后面留白

.

然后就可以把光标所在行(最后一行)滚动到空间中间位置。

还有另外一种方法

def fun():
pte.ensureCursorVisible()
pte.setFocus()

这种方式是滚动距离最小的方法保证了光标可见。但是加上

pte.setCenterOnScroll(True)

也可以保证滚动到中间。

12.光标操作

QPlainTextEdit的光标操作和QTextEdit的光标操作差不多,把里面的API列一下就可以了。

QPlainTextEdit.textCursor()                #获取光标对象
QPlainTextEdit.cursorForPosition() #获取距离指定位置最近的光标对象
QPlainTextEdit.setCursorWidth() #设定光标宽度
QPlainTextEdit.cursorWidth() #获取光标宽度——>int
QPlainTextEdit.cursorRect(QTextCursor) #获取指定挂光标对象矩形
QTextCursor.moveCursor(QTextCursor.MoveOperation,QTextCursor.MoveMode)
NoMove = ...  # type: 'QTextCursor.MoveOperation'
Start = ... # type: 'QTextCursor.MoveOperation'
Up = ... # type: 'QTextCursor.MoveOperation'
StartOfLine = ... # type: 'QTextCursor.MoveOperation'
StartOfBlock = ... # type: 'QTextCursor.MoveOperation'
StartOfWord = ... # type: 'QTextCursor.MoveOperation'
PreviousBlock = ... # type: 'QTextCursor.MoveOperation'
PreviousCharacter = ... # type: 'QTextCursor.MoveOperation'
PreviousWord = ... # type: 'QTextCursor.MoveOperation'
Left = ... # type: 'QTextCursor.MoveOperation'
WordLeft = ... # type: 'QTextCursor.MoveOperation'
End = ... # type: 'QTextCursor.MoveOperation'
Down = ... # type: 'QTextCursor.MoveOperation'
EndOfLine = ... # type: 'QTextCursor.MoveOperation'
EndOfWord = ... # type: 'QTextCursor.MoveOperation'
EndOfBlock = ... # type: 'QTextCursor.MoveOperation'
NextBlock = ... # type: 'QTextCursor.MoveOperation'
NextCharacter = ... # type: 'QTextCursor.MoveOperation'
NextWord = ... # type: 'QTextCursor.MoveOperation'
Right = ... # type: 'QTextCursor.MoveOperation'
WordRight = ... # type: 'QTextCursor.MoveOperation'
NextCell = ... # type: 'QTextCursor.MoveOperation'
PreviousCell = ... # type: 'QTextCursor.MoveOperation'
NextRow = ... # type: 'QTextCursor.MoveOperation'
PreviousRow = ... # type: 'QTextCursor.MoveOperation'

MoveOperation枚举值

MoveAnchor = ...  # type: 'QTextCursor.MoveMode'
KeepAnchor = ... # type: 'QTextCursor.MoveMode'

MoveMode枚举值

二.信号

1.文本改变

QPlainTextEdit.textChanged() 

2.选中文本改变

QPlainTextEdit.selectionChanged()

在这个函数中并没有参数传递,如果想获取选中的文本就需要结合文本光标来实现

def fun():
print('选中文本发生改变:',pte.textCursor().selectedText())

3.光标位置发生改变

QPlainTextEdit.cursorPositionChanged()

4.块的个数变化

QPlainTextEdit.blockCountChanged(int)

随函数传递块的个数(int)。

5.内容更新请求

QPlainTextEdit.updateRequest(QRect.rect,int dy)

只要内容发生变化就调用(包括光标的闪烁)。这个主要是用在类似于文本框被滚动时,由于每次滚动导致的界面上内容发生变化都相当于重绘一遍,而dy就是滚动的步长。具体的用法在下一节结合案例来说明

6.编辑状态发生改变时

QPlainTextEdit.modificationChanged()

这个主要是用在例如对文档进行编辑时,函数传递参数(bool)为True,这个时候是可以有撤销动作的,当文件被保存后,把这个状态重置一下,就不能有撤回了(就和word一样)

doc = pte.document()
doc.setModified(False) #重置被编辑状态

6.复制、撤销、重做可用时

QPlainTextEdit.copyAvailable(bool)
QPlainTextEdit.undoAvailable(bool)
QPlainTextEdit.redoAvailable(bool)

复制可用——有选中的情况下;撤销可用——被编辑状态为True;重做——有撤销作业

三.内容更新请求

QPlainTextEdit里有个信号是updateRequest(),我们结合一个案例来使用一下

好多文本编辑器都有个行号,Pycharm就有,我们在上下滚动屏幕显示的时候行号是跟着切换的。

思路就是用一个label里放置所有的行号(红色的label),父级控件是和文本框高度一致的label(限制label),限制label和文本框同属window控件。由于限制label的尺寸固定,就限制了行号label显示出的内容,当文本框发生滚动时,由于事件函数传递有滚动的y的像素值,把行号的label在y轴上移动相应的像素值就可以了。

from PyQt5.Qt import *
import sys
app=QApplication(sys.argv)
window = QWidget()
window.resize(800,500)
pte = QPlainTextEdit(window)
pte.resize(300,300)
pte.move(300,100)
num_cut = QLabel(window) #限制标签的大小
num_cut.resize(30,300)
num_cut.move(270,100)
num_cut.setStyleSheet('background-color:green')
num = QLabel(num_cut)
num.move(0,7) #偏移一点保证label里的行号和文本框里的段落能对齐
line_nums = '\n'.join([str(i) for i in range(1,101)]) #生成行号
num.setText(line_nums)
num.adjustSize() def fun(rec,dy):
num.move(num.x(),num.y()+dy) #信号内传递有滚动的y像素值
pte.updateRequest.connect(fun) window.show()
sys.exit(app.exec_())

行号滚动案例

GUI学习之十三——QPlainTextEdit学习总结的更多相关文章

  1. GUI学习之三十三——QProgressBar学习总结

    今天总结的是QProgressBar的使用方法 一.描述 提供了一个水平或垂直的进度条,用于向用户提供操作进度的指示,用户也可以从进度条看出来程序是否正在运行. 二.功能作用 1.设置范围和当前值 Q ...

  2. 201521123072《java程序设计》第十三周学习总结

    201521123072<java程序设计>第十三周学习总结 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 ...

  3. 201521123038 《Java程序设计》 第十三周学习总结

    201521123038 <Java程序设计> 第十三周学习总结 1. 本周学习总结 端口:区分一台主机上的不同服务,不是物理接口 ipconfig:查看网络配置 ping:检查网络是否连 ...

  4. 201771010134杨其菊《面向对象程序设计(java)》第十三周学习总结

    第十三周学习总结 第一部分:理论知识 第11章 事件处理(事件处理基础; 动作; 鼠标事件;AWT事件继承层次) 1. 事件源(event source):能够产生事件的对象都可 以成为事件源,如文本 ...

  5. “2017面向对象程序设计(Java)第十三周学习总结”存在问题的反馈及本周教学安排

    “2017面向对象程序设计(Java)第十三周学习总结”存在问题的反馈及本周教学安排1. 图形界面事件处理技术是Java GUI编程核心技术,要求同学们掌握其基本原理和基本编程模型:2. 本周四理论课 ...

  6. 201871010123-吴丽丽《面向对象程序设计(Java)》第十三周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  7. 201271050130-滕江南-《面向对象程序设计(java)》第十三周学习总结

      201271050130-滕江南-<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daiz ...

  8. 201871010111-刘佳华《面向对象程序设计(java)》第十三周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十三周学习总结 实验十一 图形界面事件处理技术 实验时间 2019-11-22 第一部分:理论知识总结 1.事件源:能够产 ...

  9. 201871010104-陈园园 《面向对象程序设计(java)》第十三周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

随机推荐

  1. 高级软件测试技术-任务进度和总结-Day04

    任务进度11-16 使用工具 Jira 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了这几天的学习和小组成员的努力,虽然其中还准备了考试,但是大家还是最终按时完成了任务,今 ...

  2. ASP.NET中调用百度地图API

    1.打开链接http://developer.baidu.com/map/jshome.htm这里有很多DEMO,或者你直接百度搜索“百度地图API”,第一个就是.进入后有很多方向供你选择,由于现在开 ...

  3. MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构

    后台线程 1.Master Thread 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread  内存 重做日志在以下三种情况下将重做日志缓存中的内容刷新到 ...

  4. 自动化运维--ansible(2)

    问题一:如何在多台服务器中配置Web项目上线的所有环境 解答: 1.使用ansible配置nginx服务 在安装前了解rpm与yum的区别  rpm是压缩包安装依赖包需要自己手动安装,yum安装解决依 ...

  5. 在SOUI3.0中使用数值动画

    上一篇介绍了插值动画,插值动画是直接作用于窗口对象的. 数值动画则可以作用于任何对象. SOUI内置了3种数值类型的动画,分别是SIntAnimator, SFloatAnimator, SColor ...

  6. js获取Session问题

    纯htm页面必须采用AJAX了,ASP页面:var manager='<%=session("manager")%>', ASPX页面:var manager='< ...

  7. Mysql基本管理知识

    数据库的启动 [root@node80 ~]# /etc/init.d/mysqld start #mysqld是从安装包拷贝的mysql.server Starting MySQL. SUCCESS ...

  8. 阶段3 1.Mybatis_08.动态SQL_02.mybatis中动态sql语句-where标签的使用

    这里的userSex是实体类里面的属性名,而不是数据库内的字段名称 一个老王改成性别女,为了区分一下 增加sex字段的查询 where标签 用上where和刚才的执行效果是一样的 where标签使我们 ...

  9. CentOS 6.5 编译安装Apache2.4

    一. httpd 2.4的新特 1) MPM支持运行时装载 --enable-mpms-shared=all --with-mpm=prefork|worker|event2) 支持event MPM ...

  10. excel 字母变大写 宏

    Sub ConvertToUpperCase() Dim Rng As Range Worksheets("Sheet1").UsedRange.Select For Each R ...