qt 环境下,Lua 与 QsciScintilla 库的使用
Posted 赤脚流连
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 环境下,Lua 与 QsciScintilla 库的使用相关的知识,希望对你有一定的参考价值。
Qt 环境下,调用 Lua 脚本并执行
Lua 是一种胶水式的脚本语言,精致小巧,一个完整的运行库不过 200k,更重要的是 Lua 与 C 可以相互调用,用来做一些外围处理再合适不过。例如解压升级更新,以及与应用系统无关的一些处理。下面展示在 Qt 中,调用 Lua 脚本的过程。
首先,编译 Lua 的库,可以在官网http://www.lua.org/download.html下载最新的源码包,解压。
使用 Qt Creator 创建一个静态库工程,将解压的 src 的文件(lua.c luac.c 两个文件不必添加到工程)加到静态库工程中,编译生成静态库
再新建一个 Qt 项目,把上一步得到的静态库添加到项目中,
// main.c
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
lua_State *L = luaL_newstate(); // 创建Lua虚拟机
luaL_openlibs(L); // 打开Lua状态机"L"中的所有Lua标准库
QString di = QApplication::applicationDirPath() + "/fuck.lua";
if (luaL_dofile(L, di.toUtf8()))//加载运行main.lua
{
printf("call lua failed!\n");
}
lua_close(L); // 关闭Lua状态机
return 0;
qDebug()<<"haha";
return a.exec();
}
在上述项目的执行目录中,编写如下 lua 脚本
--fuck.lua
print("fuck")
编译项目
如输出窗口有如下 fuck 字样,则表明库的生成正常,且调用 lua 脚本正常。
QsciScintilla
QsciScintilla 是开源文本编辑控件 Scintilla 库的 Qt 版本,notepad++的编辑内核用的就是 Scintilla。
其提供了诸多强大的功能,诸如高亮,行号显示,输入框提示等一系列强大的功能。
下面简单介绍一下 QsciScintilla 库的编译及使用。
官网下载 https://qscintilla.com/ 源码,解压
打开 QScintilla-2.11.5/Qt4Qt5/下的 qscintilla.pro 工程文件,编译即可生成 libqscintilla2_qt5d.a 库
新建工程项目,将 QScintilla-2.11.5\Qt4Qt5\Qsci 的所以头文件拷贝到当前工程路径下。
// mainwindow.cpp
#include "Qsci/qsciscintilla.h"
#include "Qsci/qscilexercpp.h"
#include "Qsci/qsciapis.h"
QsciScintilla *s = new QsciScintilla(this);
QsciLexerCPP *textLexer = new QsciLexerCPP;
textLexer->setColor(QColor(Qt:: yellow),QsciLexerCPP::CommentLine); //设置自带的注释行为绿色
s->setLexer(textLexer);
QsciAPIs *apis = new QsciAPIs(textLexer);
apis->add(QString("move"));
apis->add(QString("moive"));
if(apis->load(QApplication::applicationDirPath()+"/configs/highlight/toolTips.txt"))
qDebug()<<"读取成功";
else
qDebug()<<"读取失败";
apis->prepare();
s->setAutoCompletionSource(QsciScintilla::AcsAll); //自动补全所有地方出现的
s->setAutoCompletionCaseSensitivity(true); //设置自动补全大小写敏感
s->setAutoCompletionThreshold(1); //输入一个字符就会出现自动补全的提示
s->setMarginType(0,QsciScintilla::NumberMargin);//设置编号为0的页边显示行号。
s->setMarginLineNumbers(0,true);//对该页边启用行号
s->setMarginWidth(0,15);//设置页边宽度
s->SendScintilla(s->SCI_SETHSCROLLBAR, 0);
s->resize(this->width(),400);
QsciLexerCPP是c++文件的高亮处理器,看到Lexer,也能猜出是与语言的词法分析相关,实际上,QsciScintilla提供了二三十种语言的高亮处理,对应的词法分析文件是形如QsciLexerXXX的类。QsciAPIs类提供了自动补全的功能,我们可以自定义一个PLC指令表语句的自动补全如下。
toolTips.txt文件如下
LA
CALL
FB
FB?
SP
SP?
NOT
=
OUT
M??.??
I??.??
编辑框效果如下
以上是关于qt 环境下,Lua 与 QsciScintilla 库的使用的主要内容,如果未能解决你的问题,请参考以下文章