Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类
? ? 話接上篇。成功配置好Qt+Lua+toLua后,我們可以實(shí)現(xiàn)在Lua腳本中使用各個(gè)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對(duì)象lua_State *lu = luaL_newstate();luaL_openlibs(lu);// 使用tolua對(duì)QWidget類進(jìn)行“描述” 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加載并執(zhí)行腳本luaL_loadbuffer(lu, str.toLocal8Bit().data(), str.length(), "line");lua_pcall(lu, 0, 0, 0);return a.exec(); }? ? 筆者將QWidget的幾個(gè)函數(shù)都寫成了static的形式,用tolua進(jìn)行綁定。這樣在Lua腳本中,就可以順利使用綁定的函數(shù)了。下面的Lua腳本的內(nèi)容:
w = QWidget:new() w:show()w:resize(300,400)? ? 如果成功執(zhí)行的話,運(yùn)行結(jié)果應(yīng)該是這樣的:
? ? 可以看到成功建立了一個(gè)新的QWidget對(duì)象,并且大小更改了。
? ? 這就是在Lua中調(diào)用Qt類的一種方法。我們可以將Qt類中絕大多數(shù)類綁定進(jìn)去,就可以在Lua腳本中自有的使用Qt。
? ? 對(duì)Lua的各個(gè)操作可以封裝到類里,使代碼結(jié)構(gòu)更清晰。
? ? 我覺得現(xiàn)在已經(jīng)可以實(shí)現(xiàn)你的很多奇思妙想了,不是嗎?
? ? 附完整工程文件,可能要修改.pro文件中.lib文件的相對(duì)路徑:
? ??http://pan.baidu.com/s/1c0rbirm
? ? 附《Lua程序設(shè)計(jì)》電子書一本,希望有興趣的同學(xué)可以共同學(xué)習(xí)交流:
? ??http://pan.baidu.com/s/1c01k2J2
轉(zhuǎn)載于:https://www.cnblogs.com/IT-BOY/p/3572803.html
總結(jié)
以上是生活随笔為你收集整理的Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试:QQ登录测试用例
- 下一篇: I'm genius,用游戏柄控制鼠标