Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类
话接上篇。成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类。直接看代码吧。
#include "include/lua.hpp"
#include <QWidget>
#include <QApplication>
#include <QFile>
#include <QDebug> static int tolua_new_QWidget(lua_State* pState)
{
QWidget* widget = new QWidget();
tolua_pushusertype(pState, widget, "QWidget");
return ;
} static int tolua_delete_QWidget(lua_State* pState)
{
QWidget* widget = (QWidget* )tolua_tousertype(pState, , );
if(NULL != widget)
{
widget->close();
delete widget;
}
return ;
} static int tolua_Show_QWidget(lua_State* pState)
{
QWidget* widget = (QWidget* )tolua_tousertype(pState, , ); if(widget != NULL)
{
widget->show();
}
return ;
} static int tolua_Resize_QWidget(lua_State* pState)
{
QWidget* widget = (QWidget* )tolua_tousertype(pState, , );
double a = tolua_tonumber(pState, , );
double b = tolua_tonumber(pState, , );
qDebug() << a;
qDebug() << b; if(widget)
{
widget->resize((int)a, (int)b);
}
return ;
} int main(int argc, char * argv[])
{
Q_INIT_RESOURCE(resources);
QApplication a(argc, argv); // 初始化Lua对象
lua_State *lu = luaL_newstate();
luaL_openlibs(lu); // 使用tolua对QWidget类进行“描述”
tolua_open(lu);
tolua_module(lu, NULL, ); tolua_beginmodule(lu, NULL);
tolua_usertype(lu, "QWidget");
tolua_cclass(lu, "QWidget", "QWidget", "", tolua_delete_QWidget); tolua_beginmodule(lu, "QWidget");
tolua_function(lu, "new", tolua_new_QWidget);
tolua_function(lu, "show", tolua_Show_QWidget);
tolua_function(lu, "resize", tolua_Resize_QWidget);
tolua_endmodule(lu); tolua_endmodule(lu); // 读取资源文件
QFile file("://test.lua");
file.open(QIODevice::ReadOnly | QIODevice::Text); // 注意,笔者使用的事UTF-8编码,如果是ANSI编码可以去掉这句
QTextStream in(&file);
in.setCodec("UTF-8"); // 读取,并打印下来查看是否正确
QString str = in.readAll();
qDebug() << str; // Lua加载并执行脚本
luaL_loadbuffer(lu, str.toLocal8Bit().data(), str.length(), "line");
lua_pcall(lu, , , ); return a.exec();
}
笔者将QWidget的几个函数都写成了static的形式,用tolua进行绑定。这样在Lua脚本中,就可以顺利使用绑定的函数了。下面的Lua脚本的内容:
w = QWidget:new()
w:show() w:resize(,)
如果成功执行的话,运行结果应该是这样的:

可以看到成功建立了一个新的QWidget对象,并且大小更改了。
这就是在Lua中调用Qt类的一种方法。我们可以将Qt类中绝大多数类绑定进去,就可以在Lua脚本中自有的使用Qt。
对Lua的各个操作可以封装到类里,使代码结构更清晰。
我觉得现在已经可以实现你的很多奇思妙想了,不是吗?
附完整工程文件,可能要修改.pro文件中.lib文件的相对路径:
http://pan.baidu.com/s/1c0rbirm
附《Lua程序设计》电子书一本,希望有兴趣的同学可以共同学习交流:
http://pan.baidu.com/s/1c01k2J2
Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类的更多相关文章
- Win32下 Qt与Lua交互使用(三):在Lua脚本中connect Qt 对象
话接上文.笔者为了方便使用Lua,自己编写了一个Lua的类.主要代码如下: QLua.h #ifndef QLUA_H #define QLUA_H // own #include "inc ...
- C++与Lua交互(二)
上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...
- C++与lua交互之C++访问lua
假设lua中: name="gzw" id=17010805 sex=man tab={ num=100, str="hello" } foo_one=func ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- Quartz总结(二):定时任务中使用业务类(XXService)
零.引言 上一篇文章:讲到了Spring集成Quartz的几种基本方法. 在实际使用的时候,往往会在定时任务中调用某个业务类中的方法,此时使用QuartzJobBean和MethodInvokeJob ...
- Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数
话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功 ...
- QT 编译遇到重定义;不同的基类型&在QT中使用C++ lib库
最近在使用osg和qt开发,在集成osg时候因为我使用的qt版本为非opengl的版本,导致qt自己封了一遍opengl的一些基类变量如double 这时候就会跟osg中声明的opengl的类型冲突, ...
- 从零开始的Lua宅[1]:编译Lua解释器
Lua是一门神奇的脚本语言,游戏宅必备,懒人必备.Lua差多不是学起来用起来最简单的语言了,以至于简单到自身就是文档,自身就是配置文件.但是Lua的运行效率却是众多脚本中非常高的,据说仅次于V8爹下的 ...
- Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境
偶然间看到Lua这种脚本语言,有点兴趣,简单学习了一下. 发现Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. ...
随机推荐
- Android SDK下载技巧
转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/android-sdk-download-tips/ 说明 想必在国内的你,是不是经常在下载Android S ...
- mysql cluster 安装配置方案
mysql cluster (mysql 集群)安装配置方案 一.准备 1.准备服务器 计划建立有5个节点的MySQL CLuster体系,需要用到5台服务器,但是我们做实验时没有这么多机器,可以 ...
- leetcode problem 37 -- Sudoku Solver
解决数独 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated ...
- Qt-获取主机网络信息之QNetworkInterface
QNetworkInterface类提供了一个主机IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或者多个IP地 ...
- 解决在管理wordpress时权限不足的问题
我的wordpress网站的运行环境是自己手动搭建的lamp环境,在管理wordpress时经常遇到因没有足够的权限而无法执行某些操作.在linux上的权限不足的问题无外乎有两个原因,一个是wordp ...
- table隔行换色
以前做表格隔行换色,是在tr上添加不同的背景色,但在程序开发的过程需要做判断,不够方便,而且生成的代码也比较多,现在的需求逐渐修改为JQ去控制简洁的表格去显示隔行换色 <script type= ...
- 使用WebClient上传文件并同时Post表单数据字段到服务端
之前遇到一个问题,就是使用WebClient上传文件的同时,还要Post表单数据字段,一开始以为WebClient可以直接做到,结果发现如果先 Post表单字段,就只能获取到字段及其值,如果先上传文件 ...
- 利用jquery的imgAreaSelect插件实现图片裁剪示例
http://www.cnblogs.com/mizzle/archive/2011/10/13/2209891.html 将用户上传的图片进行裁剪再保存是现在web2.0应用中常常处理的工作,现在借 ...
- 设置Tomcat应用自动部署目录
只需要在Tomcat/conf目录下面新建文件夹Catalina/localhost,然后再localhost文件夹下面新建一个[应用名字.xml]文件即可,有多少个应用就新建多少个xml文件即可,x ...
- 软件测试 -- alpha测试和beta测试的区别
alpha测试是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误. Beta测试是用户公司组织各方面 ...