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</…

leetcode 242 有效的字母异位词 C++

和赎金信的思路一样 我想我本科时光是找不到女朋友了&#xff0c;哪怕是一个异性的好朋友也不会有了&#xff0c;男女比例4&#xff1a;1&#xff0c;哼 class Solution { public:bool isAnagram(string s, string t) {int table2[26]{0};for(char a:t){table2[a-a];}for(char…

1058. A+B in Hogwarts (20)

1058. AB in Hogwarts (20) 时间限制50 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueIf you are a fan of Harry Potter, you would know the world of magic has its own currency system -- as Hagrid explained it to Harry, "Seventeen silve…

jquery post 同步异步总结

最近在测试,发现有些效果不对,最后发现是post的执行顺序问题,所以研究了下,写了以下总结 1.post被请求多次,解决方法: 连接加入随机数 rand""Math.random() $.post("/Control/webControl.ashx?rand "Math.random(), { Method: "LoginIn", Parem…

js对html节点的操作

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style></style><script>function copy(){//克隆节点//1&#xff0c;得到要克隆的divvar div document.body.firstElementChild;//2,复制…

leetcode 141 环形链表 C++

两种方法一个空间O(n)&#xff0c;另一个O(1)&#xff0c;时间都是O(n)。 one class Solution { public:bool hasCycle(ListNode *head) {unordered_set<ListNode*>set;while(head){if(set.count(head))return true;set.insert(head);headhead->next;}return false;}…

1056. Mice and Rice (25)

1056. Mice and Rice (25) 时间限制100 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueMice and Rice is the name of a programming contest in which each programmer must write a piece of code to control the movements of a mouse in a given map…

Java poi读取,写入Excel2003

Java poi读取,写入Excel2003 相关阅读&#xff1a;poi读写Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl读写excel2003/2007:http://www.cnblogs.com/gavinYang/p/3576819.html package com.gavin.operational.excle;import java.io.FileInputStream; import …

leetcode 21 合并两个有序链表 C++

因为迭代比较好理解 所以我们在这里用递归 class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(!l1) return l2;else if(!l2) return l1;else if(l1->val<l2->val){l1->nextmergeTwoLists(l1->next,l2);return l1;}else{l2->…

1061. 判断题(15)

1061. 判断题(15) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue判断题的评判很简单&#xff0c;本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。 输入格式&#xff1a; 输入在第一行给出两个不超过100的正整数N和M&…

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…

终端I/O之行控制函数

下列4个函数提供了终端设备的行控制能力。其中&#xff0c;filedes引用一个终端设备&#xff0c;否则出错返回&#xff0c;errno设置为ENOTTY。 #include <termios.h> int tcdrain(int filedes); int tcflow(int filedes, int action); int tcflush(int filedes, int que…

js 正则表达式实现文本验证

<style>.spa{/*js来改变span颜色*/color: red;}</style><script type"text/javascript">function checkIn(obj){//失去焦点&#xff08;鼠标离开文本框&#xff09;时验证//文本框的值var val obj.value;//拿到文本框的名字&#xff0c;用来做swi…

1060. 爱丁顿数(25)

1060. 爱丁顿数(25) 时间限制250 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力&#xff0c;还定义了一个“爱丁顿数”E&#xff0c;即满足有E天骑车超过E英里的最大整数E。据说爱丁顿自己的…

leetcode 203 移除链表元素 C++

注意第一个元素的处理方法 今晚还有四个题要做&#xff0c;来不及解释了&#xff0c;上代码 class Solution { public:ListNode* removeElements(ListNode* head, int val) {struct ListNode*prenew ListNode(0,head);struct ListNode*temppre;if(!temp->next) return null…

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 …

求质数的个数

/我买了一本书&#xff0c;意大利作家 保罗.乔尔达诺 得奖的一本小说&#xff0c;好奇这本书有多少页。但它每页页码都是质数&#xff0c;需求如下&#xff0c;1907页书&#xff0c;每个页数以质数命名&#xff0c;求有多少页。/ package funJoy;public class calBook {public…

leetcode 701 二叉搜索树的插入操作 C++ 递归和迭代

迭代 class Solution { public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(!root) return new TreeNode(val);TreeNode*curroot;while(cur){if(val<cur->val){if(cur->left)curcur->left;else{cur->leftnew TreeNode(val);break;}}else if(val>…