欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Qt开源编辑器qsciscintilla的一些用法

程序员文章站 2023-08-12 17:13:47
首先放一张自己做的软件中的编辑器的效果图 中间红色的框就是放在Qt的tabwidget控件中的qsciscintilla编辑器 先从官网下载qsciscintilla源码,在qtcreater中编译,提取静态库和头文件,将库和Qsci中的头文件添加到自己的项目的pro配置文件中,具体编译方法可参考网 ......

首先放一张自己做的软件中的编辑器的效果图

Qt开源编辑器qsciscintilla的一些用法

中间红色的框就是放在qt的tabwidget控件中的qsciscintilla编辑器

先从官网下载qsciscintilla源码,在qtcreater中编译,提取静态库和头文件,将库和qsci中的头文件添加到自己的项目的pro配置文件中,具体编译方法可参考网上的帖子,这里不再赘述,可以运行之后再看下面的操作

1,一些常规设置,都是通过对应的函数来设置

//设置字体
qfont font("courier", 10, qfont::normal); ui->textedit->setfont(font); ui->textedit->setmarginsfont(font); qfontmetrics fontmetrics = qfontmetrics(font);
//设置左侧行号栏宽度等 ui->textedit->setmarginwidth(0, fontmetrics.width("00000")); ui->textedit->setmarginlinenumbers(0, true); ui->textedit->setbracematching(qsciscintilla::sloppybracematch); ui->textedit->settabwidth(4);
//设置括号等自动补全 ui->textedit->setautoindent(true);
//初始设置c++解析器 ui->textedit->setlexer(new qscilexercpp(this)); //设置自动补全 ui->textedit->setcaretlinevisible(true);
//设置光标所在行背景色 ui->textedit->setcaretlinebackgroundcolor(qt::lightgray); // ui->textedit->setcursorposition(2,2); //int markerdefine(markersymbol sym, int markernumber = -1); ui->textedit->sendscintilla(qsciscintilla::sci_setcodepage,qsciscintilla::sc_cp_utf8);//设置编码为utf-8
//得到光标位置
int line,col;
ui->textedit->getcursorposition(&line,&col);

2,通过sendscintilla的参数来设置

最新版编辑器(qscintilla_gpl-2.11.1)好多设置都是通过qsciscintillabase类中的sendscintilla函数来进行设置的,这个函数有多个重载:

    //! send the scintilla message \a msg with the optional parameters \a
    //! wparam and \a lparam.
    long sendscintilla(unsigned int msg, unsigned long wparam = 0,
            long lparam = 0) const;

    //! \overload
    long sendscintilla(unsigned int msg, unsigned long wparam,
            void *lparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, uintptr_t wparam,
            const char *lparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, const char *lparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, const char *wparam,
            const char *lparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, long wparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, int wparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, long cpmin, long cpmax,
            char *lpstrtext) const;

    //! \overload
    long sendscintilla(unsigned int msg, unsigned long wparam,
            const qcolor &col) const;

    //! \overload
    long sendscintilla(unsigned int msg, const qcolor &col) const;

    //! \overload
    long sendscintilla(unsigned int msg, unsigned long wparam, qpainter *hdc,
            const qrect &rc, long cpmin, long cpmax) const;

    //! \overload
    long sendscintilla(unsigned int msg, unsigned long wparam,
            const qpixmap &lparam) const;

    //! \overload
    long sendscintilla(unsigned int msg, unsigned long wparam,
            const qimage &lparam) const;

在这个类的前面有大量的枚举值,既是这个函数可以用到的参数,

Qt开源编辑器qsciscintilla的一些用法

大多数枚举值都有英文注释,可自己查找对应的参数,

这里只介绍我自己用到的几个

//sci_markerget 参数用来设置标记,默认为圆形标记
int nmask = ui->textedit->sendscintilla(qsciscintilla::sci_markerget,linenr-1); //sci_markersetfore,sci_markersetback设置标记前景和背景标记 ui->textedit->sendscintilla(qsciscintilla::sci_markersetfore, 0,qcolor(qt::red)); ui->textedit->sendscintilla(qsciscintilla::sci_markersetback, 0,qcolor(qt::red)); ui->textedit->sendscintilla(qsciscintilla::sci_markeradd,linenr-1);

效果如图

Qt开源编辑器qsciscintilla的一些用法

下面设置下划线标记

ui->textedit->sendscintilla(qsciscintilla::sci_stylesetunderline,linenr,true);
ui->textedit->sendscintilla(qsciscintilla::sci_markerdefine,0,qsciscintilla::sc_mark_underline)

效果如下

Qt开源编辑器qsciscintilla的一些用法

删除所有标记

textedit->sendscintilla(qsciscintilla::sci_markerdeleteall);

跳转标记

//跳转到下一个标记
void qscieditor::gotonext()//函数写完还未测试,大概是这个作用,可自行测试 { int line,col; ui->textedit->getcursorposition(&line,&col); ui->textedit->sendscintilla(qsciscintilla::sci_markernext,line); }
//跳转到上一个标记
void qscieditor::gotopre()
{
    int line,col;
    ui->textedit->getcursorposition(&line,&col);
    ui->textedit->sendscintilla(qsciscintilla::sci_markerprevious,line);
}

跳转光标到行line,列index

void qscieditor::setcursorposition_p(int line,int index)
{
    ui->textedit->setcursorposition(line-1,index);
    ui->textedit->setcaretlinebackgroundcolor(qt::lightgray);
    ui->textedit->sendscintilla(qsciscintilla::sci_setfirstvisibleline,line);
}

设置词法分析器

qscilexer *textlexer;//创建一个词法分析器

//常用以下几种,注意添加对应的头文件 textlexer = new qscilexercpp; textlexer = new qscilexerpython; textlexer = new qscilexerjava; textlexer = new qscilexerhtml; textlexer = new qscilexercsharp; textlexer = new qscilexercss; textlexer = new qscilexerjavascript;

一些编辑操作函数,看函数名就知道是干嘛的了,手动滑稽

    ui->textedit->undo();

    ui->textedit->redo();

    ui->textedit->copy();

    ui->textedit->cut();

    ui->textedit->paste();

    ui->textedit->findfirst(expr,true,false,true,true);

    ui->textedit->findnext();

    ui->textedit->replace(replacestr);

 常用的信号

//编辑器内容被编辑
textchanged()
//是否可复制,大概是这样copyavailable(bool)

就说这些,剩下的需要去源代码里面找了