• 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

  • 相关阅读:
    前端脚手架的那些事儿
    CSS重置默认样式reset.css代码模板
    Web 3.0 前瞻:基于区块链的下一代浏览器
    关键词定位是网站推广的基础
    6年架构师针对web前端小白,作出的职业规划建议
    和程序员约会的优点和缺点
    如何在软件开发中避免出现漏洞
    Linux下修改时区
    前端需要掌握的Nginx知识
    Nginx入门指南
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4070870.html
Copyright © 2020-2023  润新知