qt 环境下,Lua 与 QsciScintilla 库的使用

Posted 赤脚流连

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 环境下,Lua 与 QsciScintilla 库的使用相关的知识,希望对你有一定的参考价值。

Qt 环境下,调用 Lua 脚本并执行

Lua 是一种胶水式的脚本语言,精致小巧,一个完整的运行库不过 200k,更重要的是 Lua 与 C 可以相互调用,用来做一些外围处理再合适不过。例如解压升级更新,以及与应用系统无关的一些处理。下面展示在 Qt 中,调用 Lua 脚本的过程。

  1. 首先,编译 Lua 的库,可以在官网http://www.lua.org/download.html下载最新的源码包,解压。

  2. 使用 Qt Creator 创建一个静态库工程,将解压的 src 的文件(lua.c luac.c 两个文件不必添加到工程)加到静态库工程中,编译生成静态库

  3. 再新建一个 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 库的编译及使用。

  1. 官网下载 https://qscintilla.com/ 源码,解压

  2. 打开 QScintilla-2.11.5/Qt4Qt5/下的 qscintilla.pro 工程文件,编译即可生成 libqscintilla2_qt5d.a 库

  3. 新建工程项目,将 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 库的使用的主要内容,如果未能解决你的问题,请参考以下文章

Lua 需要块环境

linux下arm平台Qt编译环境搭建与解析

Nginx基础 - Nginx+Lua实现灰度发布与WAF

Linux 环境下 Lua 安装(转)

Mac 下配置Lua环境

linux下lua运行环境安装