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中的函数.由此可以引发出很多奇思妙想了. ...
随机推荐
- 牛客网算法题之All-in-All
题目: 有两个字符串s 和t,如果即从s 中删除一些字符,将剩余的字符连接起来,即可获得t.则称t是s 的子序列.请你开发一个程序,判断t是否是s的子序列. 输入描述: 输入包含多组数据,每组数据包含 ...
- [DLL] Dynamic link library (dll) 的编写和使用教程
前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...
- OpenJudge/Poj 1125 Stockbroker Grapevine
1.链接地址: http://poj.org/problem?id=1125 http://bailian.openjudge.cn/practice/1125 2.题目: Stockbroker G ...
- 专题三、ArrayList遍历方式以及效率比较
一.遍历方式 ArrayList支持三种遍历方式. 1.第一种,随机访问,它是通过索引值去遍历 由于ArrayList实现了RandomAccess接口,它支持通过索引值去随机访问元素. 代码如下: ...
- thinkcmf thinkphp隐藏后台地址
做了一个项目,上线的时候 需要隐藏掉domain.com/admin 这个后台地址,但是用的thinkcmf已经预定义好了admin模块. 我们可以用thinkphp自带的模块映射功能实现, 比方说我 ...
- Node安装与环境配置
1.nodejs(npm)安装 下载nodejs(http://nodejs.cn/)安装后,cmd下如输入 node -v 与 npm -v 出现下图版本提示就是完成了NodeJS的安装 2.n ...
- IE专用CSS,最全的CSS hack方式一览
http://blog.csdn.net/freshlover/article/details/12132801
- javascripct数组
定义数组 数组对象用来在单独的变量名中存储一系列的值. 我们使用关键词 new 来创建数组对象.下面的代码定义了一个名为 myArray 的数组对象: var myArray=new Array() ...
- sae-xhprof调试性能
1. 在storage中创建xhprof的domain 2.在xhprof中,给对应的版本应用开启调试 3.在版本内的代码加入 sae_xhprof_start(); // 需要调优的代码 // .. ...
- This transaction has been rolled back, rather than only the current.
今天上午,收到运维组同事反映某应用系统的其中一个功能报错,不是偶然性事件,每个使用该功能的用户都报错.报错内容为:This transaction has been rolled back, rath ...