QScintilla是Scintilla在QT上的移植,Scintilla是一个免费的源代码编辑控件。在普通的的文本编辑控件中能看到的功能,Scintilla都完全能够实现,而且,它还能够提供很多编辑和调试源代码时有用的特殊功能。包括语法高亮显示,错误指示,代码自动完成以及代码提示等。而且在左边的空白处(margin),可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。
Scintilla官网:https://www.scintilla.org/
入门与安装可以参考:Qt 开源控件之Qscitinlla代码编辑器入门。这篇教程里可以改进的是,将QScintilla-2.11.5直接放到你的工程文件夹底下,向.pro文件里添加路径时使用$$PWD表示当前目录的绝对路径,然后添加来自QScintilla的头文件和动态链接库。这样项目移动之后也可以正常使用。
INCLUDEPATH += $$PWD/QScintilla-2.11.5/Qt4Qt5
LIBS += -L$$PWD/QScintilla-2.11.5/build-qscintilla-Desktop_Qt_5_9_0_MinGW_32bit-Debug/debug/ -lqscintilla2_qt5d
如果使用release方式构建qscintilla,生成的是qscintilla2_qt5.lib;如果使用debug方式构建qscintilla,生成的是qscintilla2_qt5d.lib(多了一个d)。引用release方式构建生成的qscintilla2_qt5.lib,项目本身最好也使用release方式构建,不然可能构建报错;debug同理。
很多教程讲了如何使用Qscitinlla实现语法高亮、语法分析、自动补全等功能,但没有具体讲如何实现断点标记。我在看了Qt开源编辑器qsciscintilla的一些用法和Scintilla开源库使用指南(二)后,加上自己的实践,总结一下如何实现断点标记。
首先,我们new一个qscintilla,在它的margin处设置两条页边,左边的显示行号,右边的供我们打断点。
editor=new QsciScintilla(this);
//行号提示
editor->setMarginType(0,QsciScintilla::NumberMargin);//设置0号页边显示行号
editor->setMarginLineNumbers(0,true);//对0号页边启用行号
editor->setMarginWidth(0,30);//设置页边宽度
editor->setMarginType(1,QsciScintilla::SymbolMargin); //设置1号页边显示符号
editor->SendScintilla(QsciScintilla::SCI_MARKERSETFORE, 1,QColor(Qt::black)); //置标记前景和背景标记
editor->SendScintilla(QsciScintilla::SCI_MARKERSETBACK, 1,QColor(Qt::red));
editor->SendScintilla(QsciScintilla::SCI_SETMARGINMASKN,1,0x02); //1号页边显示2号标记
editor->SendScintilla(editor->SCI_SETMARGINSENSITIVEN,1,true); //设置1号页边可以点击
然后,我们创建一个connect,接收editor的margin被点击的信号,使用自定义的槽函数在相应位置打一个断点。
connect(editor,SIGNAL(marginClicked(int,int,Qt::KeyboardModifiers)),this,SLOT(addMarker(int,int,Qt::KeyboardModifiers)));
自定义槽函数如下:
void Debugger::addMarker(int m, int n, Qt::KeyboardModifiers)
{
//m为被点击的页边的编号(列),n为行
int maskn=editor->SendScintilla(QsciScintilla::SCI_MARKERGET,n);
//qDebug()<<n<<endl;
if(maskn == 0)
{
editor->SendScintilla(QsciScintilla::SCI_MARKERADD,n,m);
QString str = "break "+QString::number(n+1)+"\r\n";
//qDebug()<<str;
cmd->write(str.toStdString().c_str());
}
else
{
//editor->SendScintilla(QsciScintilla::SCI_MARKERDELETE,n,m);
}
}
这样简单的打断点就实现了。如果想详细的了解如何消除断点,进一步如何实现debug功能等,可以查看github上的完整源代码。
这是一个完整的IDE,由于是一个仓促完成的课程作业,还有很多不完美的地方。其中debug窗口的实现参见Debugger类。