女神节
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,今天的介绍就到这里吧,下期我们继续。如果你喜欢本篇文章,请给我点赞、赞赏(),分享给你的好友们吧!
领取专属 10元无门槛券
私享最新 技术干货