当前位置:首页 > 嵌入式 > 技术让梦想更伟大
[导读]在此部件上绘制行号,并将其放置在CodeEditor的viewport()的左边距区域上,QWidget类也可以帮助我们对其内容进行滚动。

来源:技术让梦想更伟大

作者:李肖遥
这次的代码编辑器比较简单,主要有以下几个功能:
  • 简单编辑
  • 显示行号
  • 突出显示当前行
如下图所示,主要来看看怎么实现。

代码编辑器的实现

代码编辑器主要是使用了CodeEditor和LineNumberArea,其实现步骤如下:
CodeEditor是继承QPlainTextEdit的小部件,在CodeEditor(LineNumberArea)中保留一个单独的小部件,在其上绘制行号。
QPlainTextEdit继承自QAbstractScrollArea,并且编辑在其viewport()的边距内进行。通过将视口的左边距设置为绘制行号所需的尺寸,为行号区域腾出空间。
在编辑代码时,我们首选QPlainTextEdit而不是QTextEdit,因为它已针对处理纯文本进行了优化。
除了用户可以使用鼠标或键盘进行的选择之外,QPlainTextEdit还允许我们添加选择,我们使用此功能突出显示当前行。

LineNumberArea类

在此部件上绘制行号,并将其放置在CodeEditor的viewport()的左边距区域上,QWidget类也可以帮助我们对其内容进行滚动。另外,如果使用断点或其他代码编辑器功能扩展编辑器,单独的窗口小部件是正确的选择。
class LineNumberArea : public QWidget
{
public:
LineNumberArea(CodeEditor *editor) : QWidget(editor) {
codeEditor = editor;
}
QSize sizeHint() const {
return QSize(codeEditor->lineNumberAreaWidth(), 0);
}
protected:
void paintEvent(QPaintEvent *event) {
codeEditor->lineNumberAreaPaintEvent(event);
}
private:
CodeEditor *codeEditor;
};

CodeEditor类定义

这是代码编辑器的类定义:
class CodeEditor : public QPlainTextEdit
{
Q_OBJECT
public:
CodeEditor(QWidget *parent = 0);
void lineNumberAreaPaintEvent(QPaintEvent *event);
int lineNumberAreaWidth();
protected:
void resizeEvent(QResizeEvent *event);
private slots:
void updateLineNumberAreaWidth(int newBlockCount);
void highlightCurrentLine();
void updateLineNumberArea(const QRect
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭