用Qsciscintilla做一个简单IDE
阅读原文时间:2021年04月24日阅读:1

用Qt的Qsciscintilla控件实现一个简单IDE

参考文档

scintilla官方文档 https://www.scintilla.org/ScintillaDoc.html
https://blog.csdn.net/weixin_38326893/article/details/80001548?utm_source=blogxgwz2
https://blog.csdn.net/e_one/article/details/71037103?locationNum=2&fps=1
https://qscintilla.com/
https://blog.csdn.net/flyear_cn/article/details/22588841

开发环境

windows10
Qt 5.11.2 (MSVC 2017, 64 bit)

准备工作

Qscitinlla下载地址

https://riverbankcomputing.com/software/qscintilla/download

编译Qscitinlla

进入文件夹QScintilla_gpl-2.10.8\Qt4Qt5\
用QtCreator打开qscintilla.pro
右下角编译环境改成Release
启动构建,构建产生的文件之后会用到

新建项目

笔者这里选择了和Qscitinlla编译时一样的Kits,没试过其他的,不知道其他的行不行
基类选择QWidget

添加Qscitinlla静态库

右键项目文件夹,选择添加库
选择外部库
库文件选择到刚刚编译Qscitinlla时产生的构建文件夹,你会知道选择哪一个的(就一个能选的),这里笔者选择的是qscintilla2_qt5.lib
选择静态库
Qt会自动在.pro文件中添加引用

添加include目录

打开项目的.pro文件
添加该行

INCLUDEPATH += D:\System\Desk\123\QScintilla_gpl-2.10.8\Qt4Qt5\

以上目录为笔者自己电脑上的目录,请自行填写下载解压的Qscitinlla文件夹中的Qt4Qt5文件夹路径

检查一下

项目头文件中添加

#include <Qsci/qsciscintilla.h>

public中添加

QsciScintilla *editor=new QsciScintilla(this);

左下角编译环境选择Release
启动构建
若不报错,恭喜你,完成了准备工作

笔者这里有个问题,不管怎样都没办法在Debug环境下运行成功…但是Debug构建没问题

简单功能实现

以下代码块中的editor均为QsciScintilla对象指针

头文件

//QsciScintilla本体
#include<Qsci/qsciscintilla.h>
//Lua语言的词法分析器
#include <Qsci/qscilexerlua.h>
//自动补全的apis
#include <Qsci/qsciapis.h>

行号提示

editor->setMarginType(0,QsciScintilla::NumberMargin);//设置编号为0的页边显示行号 
editor->setMarginLineNumbers(0,true);//对该页边启用行号
editor->setMarginWidth(0,35);//设置页边宽度

设置UTF-8编码

editor->SendScintilla(QsciScintilla::SCI_SETCODEPAGE,QsciScintilla::SC_CP_UTF8);

设置词法分析器

QsciLexer *textLexer;
textLexer = new QsciLexerLua;
editor->setLexer(textLexer);

设置自动完成

QsciAPIs *apis = new QsciAPIs(textLexer);
//在这里可以添加自定义的自动完成函数
//apis->add(QString("func_name(arg_1,arg_2) function info"));
apis->prepare();
//设置自动完成所有项
editor->setAutoCompletionSource(QsciScintilla::AcsAll);
//设置大小写敏感
editor->setAutoCompletionCaseSensitivity(true);
//每输入1个字符就出现自动完成的提示
editor->setAutoCompletionThreshold(1);

其他设置

//开启自动缩进
editor->setAutoIndent(true);
//设置缩进的显示方式
editor->setIndentationGuides(QsciScintilla::SC_IV_LOOKBOTH);
//显示选中的行号
editor->setCaretLineVisible(true);
//显示选中行号的背景色
editor->setCaretLineBackgroundColor(Qt::lightGray);
//左侧行号显示的背景色
editor->setMarginsBackgroundColor(Qt::gray);
//设置括号匹配
editor->setBraceMatching(QsciScintilla::SloppyBraceMatch);