40.QPlainTextEdit

目录

1  基本功能

1.1  创建

1.2  占位提示文本

1.2.1  设置 setPlaceholderText(str)

1.2.2  获取placeholderText()

1.3  只读设置

1.3.1  设置 setReadOnly(bool)

1.3.2  获取 isReadOnly()

1.4  格式设置

1.4.1  设置字符格式 setCurrentCharFormat()

1.4.2  获取字符格式 currentCharFormat()

1.4.3  合并字符格式 mergeCurrentCharFormal()

1.5  软换行模式

1.5.1  设置 setLineWrapMode()

1.5.2  获取 lineWrapMode()

1.6  覆盖模式

1.6.1  设置 setOverwriteMode()

1.6.2  获取 overwriteMode()

1.7  Tab功能改变

1.7.1  设置Tab功能为切换焦点 setTabChangesFoucus()

1.7.2  设置Tab缩进的距离 setTabStopWidth()

1.7.3  获取Tab功能是否为切换焦点 tabChangesFocus()

1.7.4  获取Tab缩进的距离 tabStopWidth()

2  文本操作

2.1  设置普通文本内容 setPlainText()

2.2  插入普通文本 insertPlainText()

2.3  追加普通文本 appendPlainText()

2.4  追加HTML字符串 appendHtml()

2.5  获取文本框中所有文本 toPlainText()

3  块操作

3.1  获取当前块总数 blockCount()

3.2  设置最大块个数 setMaximumBlockCount(int)

3.3  获取最大块个数 maximumBlockCount()

4  常用编辑操作

4.1  放大 zoomIn()

4.2  缩小 zoomOut()

5  滚动保证光标可见

5.1  滚动文本内容至光标位置 centerCursor()

5.2  末尾后几行强制滚动到中间

5.2.1  设置 setCenterOnScroll()

5.2.2  获取 centerOnScrooll()

5.3  不滚动到中间了,只要求光标可见 ensureCursorVisible()

6  光标设置

6.1  获取光标文本对象 textCursor()

6.2  获取指定位置的文本光标对象 cursorForPosition(QPoint)

6.3  文本光标宽度

6.3.1  设置文本光标宽度 setCursorWidth()

6.3.2  获取文本光标宽度 cursorWidth()

6.4  获取文本光标矩形

6.4.1  获取整个文本框的光标矩形 cursorRect()

6.4.2  获取文本框指定光标对象的光标矩形 cursorRect(QTextCursor)

6.5  移动光标 moveCursor()

7  信号


1  基本功能

1.1  创建

看着和QTextEdit一样

它只支持普通文本,不支持富文本,表格等其他文本形式

就运算速度来看QPlainTextEdit优于QTextEdit

在滚动时是逐行滚动的,而不是以像素为依据滚动,所以顶部的那一行总是完整的

  • QTextEdit是按照像素点滚动的,所以会出现顶部显示半行与底部显示半行的情况

继承自 QAbstractScrollArea

创建时我们也可以直接往里面放字符

1.2  占位提示文本

1.2.1  设置 setPlaceholderText(str)

1.2.2  获取placeholderText()

1.3  只读设置

1.3.1  设置 setReadOnly(bool)

我们发现在文本框中输入不了字符了

1.3.2  获取 isReadOnly()

1.4  格式设置

1.4.1  设置字符格式 setCurrentCharFormat()

运行后输入123

1.4.2  获取字符格式 currentCharFormat()

1.4.3  合并字符格式 mergeCurrentCharFormal()

运行后输入123

1.5  软换行模式

在QPlainText中,设置软换行只有两个模式,一个是有,一个是没有

  • 0 - QPlainTextEdit.NoWrap 没有软换行
  • 1 - QPlainTextEdit.WidgeWidth 有软换行

默认是有软换行的,咱们运行之后输入一串字符看一下

我们现在把它搞成没有软换行

1.5.1  设置 setLineWrapMode()

运行后输入一串1发现没有换行

1.5.2  获取 lineWrapMode()

1.6  覆盖模式

1.6.1  设置 setOverwriteMode()

运行之后我们发现光标后如果有字符会变成这样

我们输入内容时会替换掉光标中的内容

这个时候要注意一点,如果是输入法输入汉字的话,并不会覆盖掉后面的内容

我们在这个状态下输入“我”

我们发现并没有覆盖

我们如果在这个状态下输入1

发现是会被覆盖的

1.6.2  获取 overwriteMode()

1.7  Tab功能改变

由于涉及到切换焦点,我们另外搞一个文本框

1.7.1  设置Tab功能为切换焦点 setTabChangesFoucus()

运行的初始状态

此时我们按一下Tab

1.7.2  设置Tab缩进的距离 setTabStopWidth()

默认距离为80,我们先看一下初始的缩进距离

运行之后按一下Tab

之后我们设置为20

运行之后按一下Tab

1.7.3  获取Tab功能是否为切换焦点 tabChangesFocus()

1.7.4  获取Tab缩进的距离 tabStopWidth()

2  文本操作

2.1  设置普通文本内容 setPlainText()

2.2  插入普通文本 insertPlainText()

插入是指在光标后插入内容

插入文本类的光标在后面

2.3  追加普通文本 appendPlainText()

追加是在已有文本的下一行加入内容

光标依然在初始位置

2.4  追加HTML字符串 appendHtml()

只支持部分HTML并非全部

像表格的html字符串就不支持

markdown是可以识别html字符串的,我们现在像插入这个表格

我们敲几个回车让这个html更好看一点

发现不行事儿

用markdown是不太直观的,我们把类换成QTextEdit()

发现QTextEdit()是可以识别的

如果没有边框的话还是不像一个表格,我们搞个边框

我们再回到QPlainTextEdit

确实不行

2.5  获取文本框中所有文本 toPlainText()

3  块操作

由于这个涉及到获取当前的块个数,我们搞一个按钮,连一个槽函数

3.1  获取当前块总数 blockCount()

我们把blockCount()加在槽函数中

运行后我们点击一下按钮

我们按两下回车

再把光标搞到第二个回车处

3.2  设置最大块个数 setMaximumBlockCount(int)

我们设置它最多为五个块

运行之后我们按5次回车,按第6次时就没有效果了

如果我们先输入内容,再设置最大的块数,如果当前块数大于最大的块数则删去超出部分的内容

也就是说如果我们初始有1-5块的内容,此时我设置最大块数为3块,则会删除4-5块的内容

如果我们先设置最大块数为3,然后加入内容,此时我们输入完了3块的内容,想再输入第四块的内容,此时我们按下回车,会将块1的内容删除

  • 在3.2设置最大块数提到的删除,确实是删除,而不是隐藏

3.3  获取最大块个数 maximumBlockCount()

4  常用编辑操作

这些我们之前都试过,不在这里再试了

下面这两个放大与缩小我们没有试过,我们现在搞一下

  • 放大,缩小在QTextEdit()中也有

我们先看一下它原本的样子

放大或缩小的内容是文本框中的内容

4.1  放大 zoomIn()

放大一百倍

如果我们输入为负值的话就可以缩小了

  • 注:起始的值为1

现在我们再放大100倍的状态下,缩小50倍

我们也可以不加参数,我们搞一个按钮试一下

运行后我们输入123

我们点10下按钮

可以发现每按一次它都会放大

如果加参数就让他变大的更快

运行后我们输入123,然后再按10次按钮

4.2  缩小 zoomOut()

zoomOut()是负值为放大,正值为缩小

放大100倍

再缩小50倍

缩小也可以不加参数

这个是初始状态

我们现在按10次按钮

发现每按一次按钮就会变小一次

5  滚动保证光标可见

当我们在文本框中输入时,我们输入的过程中如果想看一下下面的内容,看完之后再返回光标处继续输入,这个时候回滚去找光标就很麻烦,所以我们有了滚动控制

5.1  滚动文本内容至光标位置 centerCursor()

这个得搞个按钮才明显,我们搞一个按钮然后把setCenterOnScroll()放在槽函数中

这个是我们的文本框,我们在其中搞200行数据

运行之后确实有0-199的序号,我们现在把光标放在113这里

现在我们滚到最后

点一下按钮

发现回到了113处,并且将113置于文本框中心部分

如果我们的光标在开头的前几行或末尾的后几行,它只会滚动到光标处,不会滚动到文本框中间

我们现在想将末尾的后几行滚动时滚动到中间

5.2  末尾后几行强制滚动到中间

  • 这个设置完了文本框的前面几行依然搞不到中间去

5.2.1  设置 setCenterOnScroll()

运行后我们发现与之前的初始状态不同了

现在下面多了一块空白位置且这个位置是不可以被选中的

我们现在拉到文本框的初始处

然后点一下按钮

发现回到了199处,且199处于中间位置

5.2.2  获取 centerOnScrooll()

5.3  不滚动到中间了,只要求光标可见 ensureCursorVisible()

使用这个方法,移动的距离为最短距离,最后的结果就是,如果光标不出现在文本框显示范围内,使用这个方法后,它会出现在文本框显示范围内的最上方或最下方

我们把ensureCursorVisible()放在槽函数内

运行后我们将光标放在50这个地方

现在滚到最下方

点击一下按钮

我们现在滚到最上方

点击一下按钮

6  光标设置

6.1  获取光标文本对象 textCursor()

我们现在想用光标插入一张图片 insertImage()

运行之后没看到图片且光标显示不出来

我们现在按两下回车

发现光标显示出来了

这样我们就得出一个结论,QPlainTextEdit中插入不了图片

我又试了一下光标插入表格 insertTable,发现也插入不了

6.2  获取指定位置的文本光标对象 cursorForPosition(QPoint)

  • 文本框中的每一个字符后面都有一个光标对象,只不过默认情况下不会显示所有的光标

比如我现在要获取在(0,0)处的光标对象

我们再去获取(50,50)的光标对象

光标是不在在50,50的,但是它也能获取到一个,而且和(0,0)的光标是不同的

虽然光标对象不同,虽然获取的是50,50的光标对象,但是50,50处没有字符,自然也没有光标,这个时候如果该位置没有光标,它会将光标转移到最近的位置

也就是说,在初始状态下虽然光标对象不同,但是上面两个光标的位置,其实是同一位置

我们获取光标之后可以对光标进行操作

6.3  文本光标宽度

6.3.1  设置文本光标宽度 setCursorWidth()

  • 这个就不能通过光标设置了,只能使用文本框设置

我们给宽度设置为10px

6.3.2  获取文本光标宽度 cursorWidth()

6.4  获取文本光标矩形

6.4.1  获取整个文本框的光标矩形 cursorRect()

起始点为(4,4),宽度为1,高度为17

6.4.2  获取文本框指定光标对象的光标矩形 cursorRect(QTextCursor)

6.5  移动光标 moveCursor()

它的第一个参数是QTextCursor.MoveOperation,可以为以下内容

  • QTextCursor.NoMove 将光标保持在原位
  • QTextCursor.Start 移至文档的开头
  • QTextCursor.StartOfLine 移动到当前行的开头
  • QTextCursor.StartOfBlock 移动到当前块的开头
  • QTextCursor.StartOfWord 移动到当前单词的开头
  • QTextCursor.PreviousBlock 移动到上一个块的开头
  • QTextCursor.PreviousCharacter 移至上一个字符
  • QTextCursor.PreviousWord 移到上一个单词的开头
  • QTextCursor.Up 向上移动一行
  • QTextCursor.Left 向左移动一个字符
  • QTextCursor.WordLeft 向左移动一个单词
  • QTextCursor.End 移到文档的末尾
  • QTextCursor.EndOfLine 移动到当前行的末尾
  • QTextCursor.EndOfWord 移到当前单词的末尾
  • QTextCursor.EndOfBlock 移动到当前块的末尾
  • QTextCursor.NextBlock 移动到下一个块的开头
  • QTextCursor.NextCharacter 移动到下一个角色
  • QTextCursor.NextWord 转到下一个单词
  • QTextCursor.Down 向下移动一行
  • QTextCursor.Right 向右移动一个角色
  • QTextCursor.WordRight 向右移动一个单词
  • QTextCursor.NextCell 移动到当前表中下一个表格单元格的开头。如果当前单元格是行中的最后一个单元格,则光标将移动到下一行中的第一个单元格。
  • QTextCursor.PreviousCell 移动到当前表内的上一个表格单元格的开头。如果当前单元格是行中的第一个单元格,则光标将移动到上一行中的最后一个单元格。
  • QTextCursor.NextRow 移动到当前表中下一行的第一个新单元格。
  • QTextCursor.PreviousRow 移动到当前表中上一行的最后一个单元格。

第二个参数是QTextCursor.MoveMode,可以为以下内容

  • QTextCursor.MoveAnchor 将锚点移动到与光标本身相同的位置。
  • QTextCursor.KeepAnchor 将锚点固定在原处

锚点的问题以前说过,如果锚点移动到与光标本身相同的位置则不会产生选中区域,如果将锚点固定在远处则会出现锚点-光标的选中区域

上面的移动光标位置我就不一个一个试了,我们随便搞一个展示怎么用

这个是我们文本框

移动光标我们搞一个槽函数这样比较明显,这个是我们的按钮和槽函数,我们将光标移动到文档开头的位置并不移动锚点

这个是我们运行之后的起始状态

我们点击一下按钮

发现光标回到了文档开头的位置,并且全被选中了

7  信号

  • 每当我们重新绘制文本框时候,就会触发内容更新请求的信号

我们把所有的信号与槽连接起来

运行之后,我们没有输入任何内容,我们就触发了很多次内容更新信号

因为这个文本框是不断再刷新的

我们暂时屏蔽其他所有信号,单看这一个

我们试了一下,再我们输入内容时也会触发该信号

这个信号可以传递两个参数

  • 更新区域

  • 更新垂直方向的位移

我们现在把槽函数改成这样

这个频率和光标的频率相同,我们如果不聚焦文本框之后,这个就不更新了

在默认情况下更新的区域矩形正是光标所在的矩形

当我们一直按回车按到超出原有的文本框范围之后,它会传出垂直方向的位移

这个也就是指滚动条移动的像素位移

我们可以用这个信号展示文本框中每一行的行号

加入行号我们放在 41.在QPlainTextEdit中讲

我们现在再把 内容更新信号 先屏蔽,看一下其他的

初始状态下,我们没有触发任何信号

现在我们输入一个1

编辑状态是指这个文本框有没有被编辑过

我们编辑了一次,如果不是在代码中将其恢复为未编辑状态或撤销为未编辑状态,那这个文本框今后都是已编辑状态

信号也不会再次触发了

现在我们单独测试一下编辑改变信号

我们输入一个1

我们现在右键点击撤销

我们在这也再提一下怎么修改编辑状态

我们现在再触发修改状态信号时,将修改状态改为False

我们现在输入一个1

以上我们测试了5个信号,接着我们刚刚输入完1来搞,现在我们按一下回车

块的个数改变了

这个是可以传参的,传递块的个数

我们单独来搞一下

运行后,我们按一下回车

接着刚才的按下回车继续搞,我们现在选中1

之后我们右键选择撤销

撤销了刚刚创建的块

现在我们已经测试完了九个信号

我们可以再选中文本时使用光标的selectedText()来获取选中的文本内容

我们的槽函数要这样改

  • 注:这个时候如果不把获取光标放在槽函数内是不行的

我们现在输入123后,选中23

  • 20
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Suyuoa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值