Qt文本高亮编辑器控件Qscitinlla的用法

栏目: 编程工具 · 发布时间: 6年前

内容简介:Qt文本高亮编辑器控件Qscitinlla的用法

背景

平常要是叫我们自己写高亮的文本编辑器我们肯定会先想到用QTextEdit然后用正则表达式匹配指定位置着色,但是这样子写个简单的着色还好,要是复杂点,比如要对某个编程语言的各种关键字,字符串,注释等这些着色,用正则很麻烦不说,还容易出错,而且难以写出高效率着色的代码。所以,本文的主角Qscitinlla就闪亮登场了。

Qscitinlla介绍

Qscitinlla的前身是Scintilla,一个非常强大的文本编辑器控件,我们常用的Notepad++就是基于这个库开发的,官网: http://www.scintilla.org ,Qscitinlla是用在Qt开发平台上的Scintilla的移植版本。

Qscitinlla配置

Qscitinlla下载地址: https://riverbankcomputing.com/software/qscintilla/download

根据平台下载后解压,进入 Qt4Qt5 目录,用 QtCreator 打开 qscintilla.pro ,构建项目,稍等片刻,编译完成,会在解压目录下的 build-qscintilla-Desktop_Qt ****/release 生成 qscintilla2.lib 或者 qscintilla2.a 文件,这主要是取决于你用什么编译器。然后创建一个 Qt 桌面应用,将刚才生成的静态链接库导入到工程中,并将解压目录下的 Qt4Qt5 中的 Qsci 目录拷贝到新创建的工程目录下。到这, Qscitinlla就配置好了。

Qscitinlla的使用

QsciScintilla是QWidget的非直接子类,所以,它也是个控件。在使用之前,要引入QsciScintilla控件的头文件

#include <Qsci/qsciscintilla.h>

1.创建一个QsciScintilla实例并填满主窗口

QsciScintilla *editor=new QsciScintilla(this);
setCentralWidget(editor);

这样,一个文本编辑器控件创建好了。好,本文结束。。。开玩笑的

2.实现代码高亮

QsciScintilla自带有多种语言的词法分析器,所以它支持多种语言的代码高亮,在这里,我们使用 Lua 语言的词法分析器来做例子,首先,引入Lua词法分析器类的头文件#include <Qsci/qscilexerlua.h>,然后给QsciScintilla设置词法分析器。

QsciLexerLua *textLexer = new QsciLexerLua;//创建一个词法分析器
editor->setLexer(textLexer);//给QsciScintilla设置词法分析器

3.显示行号

QsciScintilla左边可显示页边(Margins)和标记(Markers)。

页边是位于文本显示区左边的一竖条区域,它可以用于显示行号、书签、断点标记等, Scintilla最多可以有5个页边(从左到右的编号为0~4)。

标记是用于标记文本的位置。(参考: http://www.cnblogs.com/superanyi/archive/2011/04/07/2008636.html

那我们如何显示行号呢,看下面的代码:

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

Qt文本高亮编辑器控件Qscitinlla的用法

4.实现代码提示

代码提示功能依靠QsciAPIs类实现,QsciAPI类定义在Qsci/qsciapis.h中,如果你要提示的词不多,可以使用add方法往添加关键词,添加完后调用prepare方法。

QsciAPIs *apis = new QsciAPIs(textLexer);
apis->add(QString("local"));
apis->prepare();

但是如果你要提示的关键字很多,那就考虑把关键字存到文件,每个关键词为一行,然后调用load方法从文件加载了。

QsciAPIs*apis = new QsciAPIs(textLexer);
   if(!apis->load(QString("D://api.txt")))
      QMessageBox::warning(this,QString("提示"),QString("读取文件失败"));
   else
      apis->prepare();

还可以对代码提示配置其他选项。

editor->setAutoCompletionSource(QsciScintilla::AcsAll);   //设置源
editor->setAutoCompletionCaseSensitivity(true);   //设置自动补全大小写敏感
editor->setAutoCompletionThreshold(1);    //设置每输入一个字符就会出现自动补全的提示

Qt文本高亮编辑器控件Qscitinlla的用法

5.设置字体

editor->setFont(QFont("CourierNew"));

6.设置编码

Scintilla默认编码是ANSI ,所以刚开始输入中文字符会出现乱码,我们可以给它设置为UTF-8,这样中文也可以正常显示了

editor->SendScintilla(QsciScintilla::SCI_SETCODEPAGE,QsciScintilla::SC_CP_UTF8);//设置编码为UTF-8

7. SendScintilla函数

SendScintilla是外界与Scintilla交互的通道,通过SendScintilla函数,可以给QScintilla控件发送各种消息来操作它。SendScintilla函数有很多个重载形式。各种可以发送的消息被定义在qsciscintillabase.h这个头文件中。各种消息的用法,请参考QsciScintillaBase类的文档,它位于解压目录的doc下html-Qt4Qt5目录。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字化生存

数字化生存

(美)Nicholas Negroponte(尼古拉·尼葛洛庞帝) / 胡泳、范海燕 / 电子工业出版社 / 2017-1-1 / 68.00

《数字化生存》描绘了数字科技为我们的生活、工作、教育和娱乐带来的各种冲击和其中值得深思的问题,是跨入数字化新世界的*指南。英文版曾高居《纽约时报》畅销书排行榜。 “信息的DNA”正在迅速取代原子而成为人类生活中的基本交换物。尼葛洛庞帝向我们展示出这一变化的巨大影响。电视机与计算机屏幕的差别变得只是大小不同而已。从前所说的“大众”传媒正演变成个人化的双向交流。信息不再被“推给”消费者,相反,人们或他......一起来看看 《数字化生存》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试