zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4070870.html
Copyright © 2011-2022 走看看