首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PyQt5:纯文本输入框2-这次没翻车

女神节

2018.03.08

PyQt5

32篇

纯文本输入框(QPlainTextEdit)2

导读:编辑器模拟

LEARN MORE

正文

上期我们总体介绍了QPlainTextEdit的相关知识,并且简单介绍了Python类中类的概念以及举了一个生活中的小例子,本期我们继续...

从图像中可以看到,编辑器在区域左侧的区域中显示行号进行编辑。编辑器将突出显示包含光标的行。

我们在QCodeEditor中实现了编辑器,它是一个继承QPlainTextEdit的控件。我们在QCodeEditor中保留一个单独的小部件,我们在其中绘制行号。

QPlainTextEdit从QAbstractScrollArea继承,编辑发生在其viewport()的边缘。我们通过将视口(viewport,下同)的左边距设置为绘制行号所需的大小,为我们的行号区域腾出空间。

在编辑代码时,我们比QTextEdit更喜欢QPlainTextEdit,因为它为处理纯文本而优化。

现在我们将继续学习QCodeEditor和NumberBar的定义和实现。我们从NumberBar类开始。

我们在这个小部件上绘制行号,并将它放在QCodeEditor的viewport()的左边空白处。

在绘制区域时,为了简单起见,我们在QCodeEditor类中绘制区域。我们可以直接在代码编辑器上绘制行号,并删除NumberBar类。但是,QWidget类可以帮助我们scroll() 其内容。此外,如果我们希望使用断点或其他代码编辑器功能扩展编辑器,则拥有单独的窗口小部件是正确的选择。该小部件将帮助处理鼠标事件。

so,知道我们为什么要用类中类了吧!

1

QCodeEditor类

QCodeEditor继承了QPlainTextEdit类。在这个类中,我们进行了一些简单窗体属性设置,设置了视口、突出显示包含光标的行和重写了resizeEvent()事件。下面对已有的前面教程中尚未出现过的代码解释一下。

设置当前的字体和大小,这个可以随意,无所谓的。

该属性包含换行模式,默认模式是QPlainTextEdit.WidgetWidth,即类似于记事本中的自动换行,一行文字过长会换一行。文中使用QPlainTextEdit.NoWrap表明这个文件我不愿意自动换行,一行较长的文字就要在一行当中。

实例化我们的内部类,同时将当前需要标记的行号初始值为None。

cursorPositionChanged()是QPlainTextEdit所带的信号,表明只要光标位置改变,就会发出此信号,然后我们调用对应的自定义槽函数highligtCurrentLine(),也就是把当前行标黄。

setViewportMargins()这个方法来源于QPlainTextEdit的父类QAbstractScrollArea,将滚动区域周围的边距设置为左侧,顶部,右侧和底部(我们这里是左侧)。 边缘空间是空白的。 将小部件放在未使用的区域。默认情况下,所有边距都为零。

为什么要增加这两句呢?注释掉这两句看看效果吧。

注释后的

未注释的

注释之后,我们在输入的时候明显的会看到两点:1、部分字母被挡着了;2、没有黄色的标记了。这其实就是原作者的bug,增加了这两句就能更加的符合使用习惯了。

此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件大小调整事件。当调用resizeEvent()时,窗口小部件已经有了新的几何图形。 旧尺寸可通过QResizeEvent.oldSize()访问。

返回小部件边界内的区域。

创建一个QRect对象,使用整数精度在平面中定义一个矩形,这里是用一组左,顶,宽和高整数来定义。矩形通常表示为左上角和大小。QRect的大小(宽度和高度)始终等同于构成其渲染基础的数学矩形。当然QRect也可以从QPoint和QSize构成。

然后我们将这个矩形应用到number_bar这个自定义小部件上,那么它的大小就确定了。

这个函数就是用来突出显示包含光标的行。

返回光标所在块的编号,如果光标无效,则返回0。请注意,此功能仅适用于没有复杂对象(如表格或框架)的文档。

看到没有,这里表示光标换行了。

这里我搞的是黄色,红色、黑色、蓝色随便你选。

QTextEdit.ExtraSelection结构提供了一种为文档中已选择指定字符格式的方法。

一种格式,用于指定选区的前景或背景画笔/颜色。我这里是设定背景色。

设定文本的整个宽度将显示为选中状态。

通过将锚点设置为光标位置来清除当前选择。请注意,它不会删除选择的文本。

此功能允许用指定的颜色临时标记文档中的某些区域,并将其指定为选项。记住()里面是列表的形式。

NumberBar类的讲解放到下章吧,内容太多了。码字也很累啊!

2

最后

ok,今天的介绍就到这里吧,下期我们继续。如果你喜欢本篇文章,请给我点赞、赞赏(),分享给你的好友们吧!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G14JYX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券