一、概述

QTextEdit是一个高级的所见即所得的文档查看器和编辑器,支持使用HTML4样式标记的富文本格式,可以显示图像、列表和表格。

PyQt的富文本处理提供了一系列丰富的类,包括QTextEdit、QTextDocument、QTextCharFormat、QTextCursor、QTextBlock、QTextList、QTextFrame、QTextTable、QTextBlockFormat、QTextListFormat、QTextFrameFormat、QTextTableFormat等,如果要介绍清楚需要花比较多的时间,同时鉴于HTML的处理方面,可以利用Python中BeautifulSoup模块强大的功能解析和编辑(可以参见老猿Python的爬虫专题),因此本部分不进行详细介绍。推荐大家按如下几篇文章了解:

二、属性

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

  • autoFormatting:autoFormatting属性用于控制启用自动格式化功能,其类型为枚举类型AutoFormattingFlag,默认值为AutoNone即不起用,当设置为AutoBulletList时,当用户在最左边的列中输入星号(“*”)或在现有列表项中按Enter键时,自动创建项目符号列表,设置为AutoAll目前与AutoBulletList相同,以后可能会有更多的扩展。该属性可以使用方法autoFormatting() 、setAutoFormatting()来访问。
  • tabChangesFocus:tabChangesFocus属性控制tab键是否更改焦点还是接受为输入。在某些情况下,文本编辑不应允许用户使用Tab键输入制表符或更改缩进,因为这样会打断焦点链,默认值为False,可通过tabChangesFocus()和setTabChangesFocus()方法来访问
  • documentTitle:documentTitle属性保留从文本中分析的文档标题( 通过HTML标记 )。默认情况下,对于新创建的空文档,此属性包含空字符串。可以通过方法documentTitle()、setDocumentTitle()来访问。
  • undoRedoEnabled:undoRedoEnabled属性用于控制是否启用undo和redo,默认是启用,可以通过方法isUndoRedoEnabled()、setUndoRedoEnabled()来访问
  • lineWrapMode:lineWrapMode属性用于控制换行模式,其类型为枚举类型QTextEdit.LineWrapMode,缺省值为WidgetWidth,表示以词为单位在编辑器右边换行,换行出现在空白处,保持整个单词的完整性。可以调用方法lineWrapMode()、setLineWrapMode()来访问该属性。如果设置换行模式为FixedPixelWidth 或 FixedColumnWidth ,同时需要调用setLineWrapColumnOrWidth()方法设置换行的像素宽度或字符数宽度,这两种模式不会保持单词的完整性
  • readOnly:readOnly 用于控制编辑器内是否只读,默认为False,可以通过isReadOnly()、setReadOnly()进行访问
  • html:html属性提供一个将编辑器内的文本转换成html文本的接口,实际上在此设置的是一段具有完整head、html、body等tag要素的html格式化文字,如果内容不完整或语法错误就会用缺省的html文本代替。使用toHtml()将编辑器中的文字插入到html属性对应的html文本的body内,可能会根据编辑器显示文本的内容增加对应的标签,因此如果要在编辑器中输入HTML文本时,html文档基本格式的相关标签文本不要输入,输入了也没有用,因为编辑器会将相关手工输入内容全部作为纯文本处理。使用setHtml()可以修改该属性,但并不是简单将输入内容替换为该属性的值,而是将参数的内容进行解析去标签后存放在编辑器中,类似于浏览器读取html文档一样显示,同时将非显示内容的标准HTML文档基本框架格式保存到html属性中,期间大量参数中的html标签会去除,如div的标签中的内容是纯文字,则div可能就不会保存,文字作为普通文字显示,再调用toHtml时也不会恢复这个div标签,而是可能将其换成了p标签。具体情况比较复杂,老猿也没有仔细研究
  • 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
  • acceptRichText:acceptRichText属性用于控制编辑器是否接受用户的富文本插入(例如通过剪贴板或拖放),当此属性设置为False文本时,编辑器只接受来自用户的纯文本输入。缺省值为True,可以通过acceptRichText() 、setAcceptRichText()方法访问
  • cursorWidth:cursorWidth用于设置编辑器光标的像素为单位的宽度,缺省值为1,可通过方法cursorWidth() 、setCursorWidth()来访问
  • textInteractionFlags:textInteractionFlags属性用于控制编辑器怎么响应用户的输入,其类型为Qt.TextInteractionFlags,用于控制编辑器是否可键盘或鼠标选择文本、是否可编辑、链接是否鼠标或键盘访问等,缺省值依赖于编辑器是否只读或者是否派生类QTextBrowser对象,可通过textInteractionFlags()、setTextInteractionFlags()方法访问,具体枚举类型值参考官方文档
  • placeholderText:placeholderText为编辑器的占位符,当编辑器中无文字时以灰色显示在编辑器中,一旦输入字符自动清除,可通过方法placeholderText()、setPlaceholderText()访问

除了Designer中可以设置的属性外,QLineEdit还有个plainText属性:

  • plainText:plainText属性用于保存编辑器中的纯文本,调用toPlainText()会返回编辑器中的纯文本,如果文本编辑具有其他内容类型(如html标记),调用toPlainText()不会将内容转换为纯文本,唯一例外是会将&nbsp(non-break space,&nbsp在HTML中表示1个空格)替换为空格,可以调用setPlainText()方法修改该属性的值。请参考《PyQt(Python+Qt)学习随笔:QTextEdit的setText、setHtml、setPlainText之间的区别

三、重要方法

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

  • append方法

    append方法是个槽方法,该方法是在编辑器的最后新加一段参数对应的文本,该段文本的格式与当前光标所在段相同。调用语法:append(str text)
  • canPaste()方法:用于返回是否可以从剪切板中粘贴文本到编辑器中
  • clear()方法:槽方法,清楚编辑器中所有文本,redo/undo历史也会被清除
  • copy方法:槽方法,用于将编辑器中选中文本拷贝到剪切板中
  • createStandardContextMenu方法:

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

    QTextDocument.FindFlags())
  • bool find(QRegExp exp, QTextDocument.FindFlags options =

    QTextDocument.FindFlags())

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

  • insertHtml()方法:将参数给定文本按照HTML文本处理插入当前位置
  • 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)
  • setTextBackgroundColor()方法:setTextBackgroundColor是槽方法,设置背景色,可以通过textBackgroundColor()方法获取对应值
  • setTextColor()方法:setTextColor是槽方法,设置文本颜色,可以通过textColor()获取对应值
    • setTextCursor()方法:setTextCursor方法用于设置当前可见的光标对象,调用语法:setTextCursor(QTextCursor cursor),当前光标对象可通过textCursor()方法获取
  • zoomIn()、zoomOut()方法:两者都是槽方法,放大或缩小文本字体的大小指定参数大小,基本字体大小可以通过setFontPointSize设置

四、信号

  • copyAvailable(bool yes):当文本被选中或去选中时发射该信号,表示是否可拷贝,选中是yes为True,去选中时为False
  • currentCharFormatChanged(QTextCharFormat f):当前文本格式控制被改变时发射本信号
  • cursorPositionChanged():光标位置改变时发射该信号
  • redoAvailable(bool available):当redo的状态发生变化时发射该信号
  • :selectionChanged():当选择文本发生变化时发射该信号
  • textChanged():当文本内容发生变化时发射该信号
  • undoAvailable(bool available):当undo的状态发生变化时发射该信号

五、小结

QTextEdit是一个所见即能得的富文本编辑器,可以使用setHtml()设置或替换文本,可以使用clear()删除整个文本。文本本身可以使用QTextCursor类或使用便利函数insertHtml()、insertPlainText()、append()或paste()插入。QTextCursor还可以将复杂的对象(如表或列表)插入到文档中,默认情况下,文本编辑以空白换行以适应文本编辑部件。

QTextEdit中的文本对象依赖于QTextDocument类进行管理,QTextDocument类借助QTextCursor可以对文本进行丰富的操作。但限于时间和篇幅,本文并没有对QTextDocument和QTextCursor进行详细介绍。大家可以参考老猿提供的参考文档或者官网文档。

老猿Python,跟老猿学Python!

PyQt(Python+Qt)学习随笔:富文本编辑器QTextEdit功能详解的更多相关文章

  1. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

  2. PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性

    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...

  3. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox增加自定义按钮的方法

    在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...

  4. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...

  5. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

    老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...

  6. PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...

  7. PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑>中,老猿觉得dragE ...

  8. PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项

    老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性

    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...

随机推荐

  1. python爬虫09selenium

    selenium 变成了爬虫利器 我们先来安装一下 pip install selenium 接着我们还要下载浏览器驱动 小帅b用的是 Chrome 浏览器 所以下载的是 Chrome 驱动 当然你用 ...

  2. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  3. 对于STM32F103的USART的通讯调试

    USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发 ...

  4. MyBatis源码解析

    在讲解MyBatis之前,先说下传统JDBC连接数据库的弊端: 1.JDBC底层没有实现连接池,从而导致操作数据库需要频繁的创建和释放,影响性能: 2.JDBC的代码散落在Java代码中,如果需要修改 ...

  5. exec 家族库函数以及系统调用(execl,execle,execlp and execv,execvp,execve)

    (1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...

  6. 在linux下,为什么 i386 ELF可执行文件默认从地址(.text)0x08048000开始分配。 而 x64是0x400000

  7. 极客mysql08

    1.innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view) 2.事务在启动时会拍一个快照,这个快照是基于整个库的. 基于整个库的意思就是说一个事务内,整个库 ...

  8. python之 栈与队列

    忍不住想报一句粗口"卧槽"这尼玛python的数据结构也太特么方便了吧 想到当初学c语言的数据结构的时候,真的是一笔一划都要自己写出来,这python尼玛直接一个模块就ok 真的是 ...

  9. Appium常用操作之「Toast提示信息获取」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:Oschina.云+社区.知乎等各大平台都有. 目录 一.什么是 Toast 二.获取 Toast 提示信息的前提 1.针对这种元素,有的时候我们需要 ...

  10. 关于重写equals同时重写hashcode

    1.Object中equals方法和hashcode public boolean equals(Object obj) { return (this == obj); } public native ...