话接上篇。成功配置好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类的更多相关文章

  1. Win32下 Qt与Lua交互使用(三):在Lua脚本中connect Qt 对象

    话接上文.笔者为了方便使用Lua,自己编写了一个Lua的类.主要代码如下: QLua.h #ifndef QLUA_H #define QLUA_H // own #include "inc ...

  2. C++与Lua交互(二)

    上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...

  3. C++与lua交互之C++访问lua

    假设lua中: name="gzw" id=17010805 sex=man tab={ num=100, str="hello" } foo_one=func ...

  4. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  5. Quartz总结(二):定时任务中使用业务类(XXService)

    零.引言 上一篇文章:讲到了Spring集成Quartz的几种基本方法. 在实际使用的时候,往往会在定时任务中调用某个业务类中的方法,此时使用QuartzJobBean和MethodInvokeJob ...

  6. Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数

    话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功 ...

  7. QT 编译遇到重定义;不同的基类型&在QT中使用C++ lib库

    最近在使用osg和qt开发,在集成osg时候因为我使用的qt版本为非opengl的版本,导致qt自己封了一遍opengl的一些基类变量如double 这时候就会跟osg中声明的opengl的类型冲突, ...

  8. 从零开始的Lua宅[1]:编译Lua解释器

    Lua是一门神奇的脚本语言,游戏宅必备,懒人必备.Lua差多不是学起来用起来最简单的语言了,以至于简单到自身就是文档,自身就是配置文件.但是Lua的运行效率却是众多脚本中非常高的,据说仅次于V8爹下的 ...

  9. Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境

    偶然间看到Lua这种脚本语言,有点兴趣,简单学习了一下. 发现Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. ...

随机推荐

  1. jQuery 扩展 【ajax实例】

    先前写工具类都是自定义类,直接prototype,jQuery扩展这一块儿,一直也没写过,刚好今天有空,写个试试. 已经有很多人对jQuery,jQuery.fn,jQuery.fn.extend详细 ...

  2. 关于ligerUi的ligertree的初始化默认选中指定项目的方法

    LigerUi中ligerTree官方示例代码片段: var parm = function (data) { return data.text.indexOf('节点1.3') == 0; }; t ...

  3. 浅谈MVC、MVP、MVVM架构模式的区别和联系

    MVC.MVP.MVVM这些模式是为了解决开发过程中的实际问题而提出来的,目前作为主流的几种架构模式而被广泛使用. 一.MVC(Model-View-Controller) MVC是比较直观的架构模式 ...

  4. 请求与通配符 mime 映射相匹配。请求映射到静态文件处理程序。如果有不同的前提条件,请求将映射到另一个处理程序。

    打开IIS管理器,找到“处理程序映射”,在列表右击选择“添加脚本映射”即可.eg:*.aspx,将该类型的页面的处理程序映射为“%windir%\Microsoft.NET\Framework\v4. ...

  5. 关于为什么window.frames[0].src不能获取src

    在DOM文档对象模型中,window对象处于最高层,而框架除了是当前窗体的一个节点外,本身也是独立window对象,当frames作为window对象时,有name属性, 而没有src属性,只有作为节 ...

  6. 谈谈我对OAuth的理解

    自己的理解是,OAuth是一种授权标准.   用于为除了用户之外的第三方应用授权,   并且在授权过程中,第三方应用不会接触到用户的任何信息,   授权完成后,第三方应用可访问用户授权范围内的信息. ...

  7. [Linux]root默认密码问题

    Linux/Ubuntu root默认密码问题   Ubuntu安装后root是没有默认的密码的,因为你还没给root设置密码,你第一个 user 是在 admin 组,他可以给 root 设置密码, ...

  8. django1.6之创建用户

    如何你运行python manager.py syncdb(数据库同步成功) 则运行一下代码 >>> from django.contrib.auth.models import U ...

  9. Python自省学习

    1. 访问对象的属性 class MyClass(): a=' b=' def __init__(self): pass def write(self): print self.a,self.b my ...

  10. Html5 布局经验分享-第1集

    移动端的布局与pc端的布局相比 移动端的布局就简单的多,兼容性不必考虑那么多,css3各种特性基本上是可以放肆的写:(个人看法) 本人做移动web 布局一段时间了,把这其中遇到的一些问题总结下来,均是 ...