您的位置:首页 > 编程语言 > Python开发

PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解

2020-04-28 18:39 991 查看

一、概述

QPlainTextEdit是用于纯文本的一个高级文档编辑器部件,为支持处理大文档和快速响应用户输入进行了特定优化。QPlainTextEdit处理文本是按段和字符,段落是一个格式化的字符串,界面换行会以适应编辑部件的宽度方式以整词词为单位进行。默认情况下,纯文本中的一个换行符表示一个段落。文档由零个或多个段落组成。段落中的每个字符都有自己的属性,例如字体和颜色。

PyQt的文本处理提供了一系列丰富的类,包括QTextDocument、QTextCharFormat、QTextCursor、QTextBlock、QTextList、QTextFrame、QTextTable、QTextBlockFormat、QTextListFormat、QTextFrameFormat、QTextTableFormat等,如果要介绍清楚需要花比较多的时间,因此本部分不展开进行介绍。推荐大家按如下两篇文章了解:

二、属性

文本编辑QPlainTextEdit在Designer中可以设置的属性如下:

可以看到QPlainTextEdit的属性与QTextEdit的属性很多是相同的。

  • tabChangesFocus:tabChangesFocus属性控制tab键是否更改焦点还是接受为输入。在某些情况下,文本编辑不应允许用户使用Tab键输入制表符或更改缩进,因为这样会打断焦点链,默认值为False,可通过tabChangesFocus()和setTabChangesFocus()方法来访问
  • documentTitle:documentTitle属性保存文档标题。默认情况下,对于新创建的空文档,此属性包含空字符串。可以通过方法documentTitle()、setDocumentTitle()来访问。
  • undoRedoEnabled:undoRedoEnabled属性用于控制是否启用undo和redo,默认是启用,可以通过方法isUndoRedoEnabled()、setUndoRedoEnabled()来访问
  • lineWrapMode:lineWrapMode属性用于控制换行模式,其类型为枚举类型QPlainTextEdit.LineWrapMode,缺省值为WidgetWidth,表示以词为单位在编辑器右边换行,换行出现在空白处,保持整个单词的完整性。可以调用方法lineWrapMode()、setLineWrapMode()来访问该属性。如果不以词为单位来换行,则需要调用setWordWrapMode来改变词换行的策略。如果设置换行模式为NoWrap 则不会换行。
  • readOnly:readOnly 用于控制编辑器内是否只读,默认为False,可以通过isReadOnly()、setReadOnly()进行访问
  • plainText:plainText属性为编辑器中的文本内容,可以通过方法toPlainText()、setPlainText()来进行属性访问,当通过setPlainText来改变文本内容时,也会触发textChanged()信号
  • overwriteMode:overwriteMode属性用于控制用户输入文本是否替换现有文本,如果为True,则输入字符从当前光标位置开始逐一替换当前的字符,为False则在光标处插入输入字符。缺省值为False,可以通过方法overwriteMode()、setOverwriteMode()进行访问
  • tabStopWidth:tabStopWidth属性用于控制编辑器中输入tab键时移动的像素数,默认值为80像素,可以通过方法tabStopWidth()、setTabStopWidth()来访问,不过该属性在Qt 5.10以后版本中被下面的tabStopDistance所替代,在5.13的文档中就没有该属性,但实际上类方法还是支持的,tabStopWidth与tabStopDistance的唯一区别是前者为整型、后者为浮点数,更精确,在Designer中二者的值也是联动的,tabStopWidth改变直接修改tabStopDistance为tabStopWidth的值,如果tabStopDistance值改变,则将tabStopDistance四舍五入后的值作为tabStopWidth的值,最终生成的代码tabStopDistance、tabStopWidth都会设置,这个与QTextEdit不同
  • cursorWidth:cursorWidth用于设置编辑器光标的像素为单位的宽度,缺省值为1,可通过方法cursorWidth() 、setCursorWidth()来访问
  • textInteractionFlags:textInteractionFlags属性用于控制编辑器怎么响应用户的输入,其类型为Qt.TextInteractionFlags,用于控制编辑器是否可键盘或鼠标选择文本、是否可编辑、链接是否鼠标或键盘访问等,缺省值依赖于编辑器是否只读,可通过textInteractionFlags()、setTextInteractionFlags()方法访问,具体枚举类型值参考官方文档
  • maximumBlockCount:maximumBlockCount属性用于控制编辑器中文档最大的块数,如果设定该属性的值时文档的块数已经超出了该值,则会从文档的开头去除多余的块数。如果值为0或负数表示文档的块数不受限制,缺省值为0,可通过方法maximumBlockCount()、setMaximumBlockCount()访问该属性的值
    :块是文本编辑器处理文件的单位,一个文档由一系列块组成,块由 QTextBlock对象表示,使用QTextBlockFormat来控制块的格式特征信息,块的类型可以是文本段、表格、列表、图像等
  • backgroundVisible:backgroundVisible属性用于控制背景调色板在文档外区域是否可见,如果设置为True,编辑器视口中没有文本覆盖的部分也会使用调色板绘制背景,否择不绘制。该功能使用户能够直观地区分使用调色板的基色绘制的文档区域和任何文档未覆盖的空白区域。如图:
  • centerOnScroll:centerOnScroll属性保留光标是否应在屏幕上居中。如果设置为True,则纯文本编辑将垂直滚动文档,使光标在视口中心可见。这也允许文本编辑滚动到文档末尾下方。否则,如果设置为False,则纯文本编辑将滚动尽可能小的数量以确保光标可见。默认值为False,可以通过方法centerOnScroll()、setCenterOnScroll()进行访问
  • placeholderText:placeholderText为编辑器的占位符,当编辑器中无文字时以灰色显示在编辑器中,一旦输入字符自动清除,可通过方法placeholderText()、setPlaceholderText()访问

三、重要方法

下面复杂的方法会介绍调用语法,不复杂的方法就不介绍调用语法,大家可以官方文档速查:

  • appendHtml()方法:槽方法,用于在编辑器末尾增加一段参数所指的html文本。虽然QPlainTextEdit是个纯文本编辑器,但也是可以解析html报文的,使用appendHtml方法将html报文增加后,在界面上显示的是解析后的内容
案例:

使用appendHtml和appendPlainText将同一段html报文加

html = '''<link  href="https://blog.csdn.net/LaoYuanPython"/><title>老猿Python</title><div>老猿Python网址:https://blog.csdn.net/LaoYuanPython</div>'''
self.plainTextEdit.appendHtml(html)
self.plainTextEdit.appendPlainText('\n************************************************\n')
self.plainTextEdit.appendPlainText(html)

执行后界面显示效果如下:

  • appendPlainText():槽方法,用于在编辑器末尾增加一段参数所指的纯文本
  • blockCount()方法:用于获取文档中的块数,空文档的块数为1
  • canPaste()方法:用于返回是否可以从剪切板中粘贴文本到编辑器中
  • clear()方法:槽方法,清楚编辑器中所有文本,redo/undo历史也会被清除
  • copy()方法:槽方法,用于将编辑器中选中文本拷贝到剪切板中
  • cut()方法:槽方法,用于将编辑器中选中文本拷贝到剪切板中后删除
  • createStandardContextMenu()方法:
    这个方法都用于创建在编辑器中使用鼠标右键时显示的弹出菜单,只不过有带参和不带参的两种调用方式,带参数的是在文档中指定位置弹出,这样可以实现在编辑器的不同位置会弹出不同的快捷菜单。调用语法:
    createStandardContextMenu()、createStandardContextMenu(QPoint position)
  • currentCharFormat()方法:返回当前的字符格式,其类型为QTextCharFormat,QTextCharFormat用于控制QTextEdit中的文本格式(这些文本的存储类型为QTextDocument对象,可以通过QTextEdit的document()方法获取,关于QTextCharFormat和QTextDocument对象在本文中不详细介绍),这些文本格式控制信息用于指定文本的一些可视化格式,如同超文本中的可视化格式控制信息
  • cursorForPosition()方法:返回指定位置的QTextCursor文本光标对象,QTextCursor文本光标是通过模拟文本编辑器中光标行为的编程接口,用于访问和修改文本文档的内容和底层结构的对象。QTextCursor包含有关光标在QTextDocument中的位置及其所做的任何选择的信息。QTextCursor是根据文本光标在文本编辑器中的行为方式建模的,它提供了通过用户界面执行标准操作的编程方法。
  • document()方法:document方法返回文本编辑器依赖的QTextDocument文档管理对象,通过该对象可以对文本进行丰富的操作,可以调用setDocument方法改变文本编辑器的文档对象
  • ensureCursorVisible()方法:使用该方法确保编辑器中的光标可见,如果当前不可见则可以滚动文本
  • find()方法:在编辑器中查找指定字符串,调用语法:
  • bool find(str exp, QTextDocument.FindFlags options =
    QTextDocument.FindFlags())
  • bool find(QRegExp exp, QTextDocument.FindFlags options =
    QTextDocument.FindFlags())

其中的exp可以是普通字符串,也可是QRegExp 类型的正则表达式,其中options用于指定是向前或向后查找、查找时是否匹配大小写、是否整词匹配,具体取值请参考官方文档。当exp为正则表达式则是否匹配大小写的选项被忽略,而是由正则表达式来控制是否匹配大小写

  • insertPlainText()方法:将参数给定文本插入当前位置
  • moveCursor()方法:控制编辑器中光标进行移动,调用语法:
    moveCursor(operation, mode = QTextCursor.MoveAnchor)
    ,其中operation为枚举类型QTextCursor.MoveOperation,用于控制光标的移动方式,如移动到文档开始、移动到行首等,具体取值参考官方文档,mode 为枚举类型QTextCursor.MoveMode,具体取值参考官方文档
  • paste()方法:paste是槽方法,将剪切板的文本拷贝到当前位置
  • redo()、undo()方法:undo、redo是槽方法,undo()方法执行后可以使用redo重新执行最后一次的操作
  • selectAll()方法:selectAll是槽方法,选择所有文本
  • setCurrentCharFormat()方法:设置文本格式控制信息,调用语法:
    setCurrentCharFormat(QTextCharFormat format)
  • setTextCursor()方法:setTextCursor方法用于设置当前可见的光标对象,调用语法:
    setTextCursor(QTextCursor cursor)
    ,当前光标对象可通过textCursor()方法获取
  • zoomIn()、zoomOut()方法:两者都是槽方法,放大或缩小文本字体的大小指定参数大小,基本字体大小可以通过setFontPointSize设置

四、信号

  • blockCountChanged(int newBlockCount):当文本中块数发生变化时发射该信号,参数为最新的块数
  • copyAvailable(bool yes):当文本被选中或去选中时发射该信号,表示是否可拷贝,选中是yes为True,去选中时为False
  • cursorPositionChanged():光标位置改变时发射该信号
  • modificationChanged(bool changed):文档的内容发生改变(包括undo和redo操作引发的文档内容改变)时就发射该信号
  • redoAvailable(bool available):当redo的状态发生变化时发射该信号
  • :selectionChanged():当选择文本发生变化时发射该信号
  • textChanged():当文本内容发生变化时发射该信号
  • undoAvailable(bool available):当undo的状态发生变化时发射该信号
  • updateRequest(QRect rect, int dy):当文本文档需要更新指定的rect区域时,会发出此信号。如果文本是滚动的,rect将覆盖整个视区。如果文本是垂直滚动的,则dy携带滚动的视区像素数。该信号的目的是支持纯文本编辑子类中的额外部件,例如显示行号、断点或其他额外信息。

五、小结

QPlainTextEdit的很多功能支持技术与 QTextEdit相同。与QTextEdit相同,QPlainTextEdit中的文本对象依赖于QTextDocument类进行管理,QTextDocument类借助QTextCursor可以对文本进行丰富的操作。但限于时间和篇幅,本文并没有对QTextDocument和QTextCursor进行详细介绍。大家可以参考概述部分老猿提供的参考文档或者官网文档。

老猿Python,跟老猿学Python!

  • 点赞
  • 收藏
  • 分享
  • 文章举报
LaoYuanPython 博客专家 发布了796 篇原创文章 · 获赞 3490 · 访问量 44万+ 他的留言板 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐