用Qt写一个简单的代码编辑器
时间:2021-07-03 15:58:33
[导读]在此部件上绘制行号,并将其放置在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





