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 1;
}static int tolua_delete_QWidget(lua_State* pState)
{QWidget* widget = (QWidget* )tolua_tousertype(pState, 1, 0);if(NULL != widget){widget->close();delete widget;}return 1;
}static int tolua_Show_QWidget(lua_State* pState)
{QWidget* widget = (QWidget* )tolua_tousertype(pState, 1, 0);if(widget != NULL){widget->show();}return 1;
}static int tolua_Resize_QWidget(lua_State* pState)
{QWidget* widget = (QWidget* )tolua_tousertype(pState, 1, 0);double a = tolua_tonumber(pState, 2, 0);double b = tolua_tonumber(pState, 3, 0);qDebug() << a;qDebug() << b;if(widget){widget->resize((int)a, (int)b);}return 1;
}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, 0);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, 0, 0, 0);return a.exec();
}

    笔者将QWidget的几个函数都写成了static的形式,用tolua进行绑定。这样在Lua脚本中,就可以顺利使用绑定的函数了。下面的Lua脚本的内容:

w = QWidget:new()
w:show()w:resize(300,400)

    如果成功执行的话,运行结果应该是这样的:

    可以看到成功建立了一个新的QWidget对象,并且大小更改了。

    这就是在Lua中调用Qt类的一种方法。我们可以将Qt类中绝大多数类绑定进去,就可以在Lua脚本中自有的使用Qt。

    对Lua的各个操作可以封装到类里,使代码结构更清晰。

    我觉得现在已经可以实现你的很多奇思妙想了,不是吗?

    附完整工程文件,可能要修改.pro文件中.lib文件的相对路径:

    http://pan.baidu.com/s/1c0rbirm

    附《Lua程序设计》电子书一本,希望有兴趣的同学可以共同学习交流:

    http://pan.baidu.com/s/1c01k2J2

转载于:https://www.cnblogs.com/IT-BOY/p/3572803.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1099. Build A Binary Search Tree (30)

1099. Build A Binary Search Tree (30) 时间限制100 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueA Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains o…

mysql列属性auto(mysql笔记四)

常见的的是一个字段不为null存在默认值 没值得时候才去找默认值&#xff0c;可以插入一个null到 可以为null的行里 主键&#xff1a;可以唯一标识某条记录的字段或者字段的集合 主键设置 主键不可为null,声明时自动设置为not null 字段上设置 字段名 primary key定义完字段后 …

详解html结构之间的各个关系,层级关系(以列表为例)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>层级关系查找元素</title></head><body><div id "div">hello<ul id ""><li>li1</li><li>li2</…

css和 js 改变html里面的定位。

css和 js 改变html里面的定位。&#xff08;三种方式&#xff09; <style type"text/css">#div1{border: 1px aquamarine solid;/*固定定位&#xff1a;此元素在整个网页的位置不变,固定某处不动*/position : fixed;left: 20px;top: 10px;}#div2{/*相对定位&am…

unity3d由多个部分组成一个角色

摘自http://forum.unity3d.com/threads/16485-quot-stitch-multiple-body-parts-into-one-character-quot So I have many many models. Each has a skeleton, material, etc. I want to take some of these and combine them into one so I can apply animation commands to …

解决ListView 缓存机制带来的显示不正常问题

ListView加载数据原理:系统绘制ListView时&#xff0c;首先会用getCount&#xff08;&#xff09;函数得到要绘制的这个列表的长度&#xff0c;然后开始逐行绘制。然后调用getView()函数&#xff0c;在这个函数里面首先获得一个View&#xff08;简单item&#xff0c;如字符串或…

windows phone (12) 小试自定义样式

windows phone (12) 小试自定义样式 原文:windows phone (12) 小试自定义样式样式在BS开发中经常用到&#xff0c;在wp中系统也提供了解决办法&#xff0c;就是对设置的样式的一种资源共享&#xff0c;首先是共享资源的位置&#xff0c;它是在App类中&#xff0c;之前我们已经有…

xdoj判断堆栈出栈序列是否有效c++

我在leetcode上写过类似的题&#xff0c;这个代码在xdoj上只能得***50***分&#xff0c;跪求各位大佬挑挑毛病。 #include<stack> #include<iostream> #include<vector> using namespace std; int main(){vector<int>poped;stack<int>s;int n,t;…

ArrayList的remove方法(重写equals方法) 与LinkedList的常用操作

package C12_18;import java.util.ArrayList;public class joy {public static void main(String[] args) {show();//重写equals方法&#xff0c;移除集合里面的元素。public static void show() {ArrayList<dog> al new ArrayList<dog>();al.add(new dog("j…

android学习日记13--数据存储之ContentProvide

3、ContentProvider  数据在Android当中是私有的&#xff0c;当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。ContentProvider实现多应用程序间的数据共享类一般利用ContentProvider为需要共享的数据定义一个URI(统一资源定位符)然后其他程序通过Context获得C…

cin,cin.get(),getline()

我势必扫清我对c的各种疑惑&#xff0c;重拾csdn水文之任 结论&#xff1a;cin在获得需要接受的东西之前&#xff0c;对缓冲区里的空格和换行符不会理睬(但是会把它们从缓冲区删去)&#xff0c;但如果达到了可以结束接受的时候&#xff0c;空格和换行符都会让cin不再接 收,并且…

Java 字节和字符流的读写+Buffered

一个关于IO流的导图 IO流字节的读写&#xff0c;实现复制 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class TestCopy {public static void main(String[] args) throws IOException {copyT…

1070. 结绳(25)

1070. 结绳(25) 时间限制200 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳…

Java预编译和批处理

预编译 package csdn.prepare.take;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class TestCompiling {public static void main(String[] args) {prep…

Java模拟事务Demo

Java操作Oracle事务&#xff0c;以转账为例。 转账之前 package translate.commit;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class CommitRollback…

设计模式4-创建型模式-Prototype模式

意图&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型对象创建新的对象。 原型模式的结构比较简单&#xff0c;在使用C实现该模式时重点要注意deep copy和shallow copy的问题。prototype模式在实际使用的过程中&#xff0c;可以通过增加一个原型管理…

Android--通知之Notification

前言 之前一篇博客讲了Android下使用Toast的方式提示消息。这篇博客讲解一下在Android中使用Notification提示消息给用户&#xff0c;Notification是一种具有全局效果的通知&#xff0c;程序一般通过NotificationManager服务来发送Notification。在本篇博客中&#xff0c;将介绍…

UDP协议下的DatagramSocket和DatagramPacket

1&#xff0c;UDP协议? 面向无连接&#xff0c;数据不安全&#xff0c;但速度快。不区分客户端与服务端。 2&#xff0c;实现通信&#xff1f; (三个达到) IP 简单说就是你电脑地址。端口 你电脑里面软件的地址。协议 如何进行通讯。 DatagramSocket 用来发送和接收数据报包的…

使用Log4J监控系统日志邮件警报

使用Log4J监控系统日志邮件警报 前言 在系统上线后&#xff0c;有时候遇到系统故障&#xff0c;这时候就可以登录服务器查看系统日志来排查问题。但是需要登录服务器&#xff0c;下载查找相关异常日志比较麻烦。而且没有监控的话&#xff0c;也无法实时了解到系统是否正常运行。…