Mac下在Qt5里面测试liblua.a和libtolua.a库

编译liblua.a和libtolua.a库文件请参考我上一篇博文Mac下编译Lua和ToLua

  1. 安装Qt5
    下载最新的Qt5安装包qt-opensource-mac-x64-5.11.0.dmg,安装步骤可参考博文https://blog.csdn.net/qq_37486501/article/details/80632151
    安装过程类似,只不过版本不同,这里使用的版本是5.11
    但是,安装完成后并没有在启动台中找到快捷方式,没办法,只好自己手动创建一个。打开Qt5安装目录,默认在/Users/用户名目录(这里是/Users/dev/),找到Qt5.11.0的Qt Creator文件,制作一个替身文件: Qt Creator文件
    把制作好的替身文件移动到应用程序目录下:
    启动程序快捷方式
    这样在启动台中就可以见到Qt5启动快捷方式了

  2. 测试liblua.a库
    启动Qt Creator,然后新建一个控制台工程:
    新建控制台工程
    创建好之后,右键工程名称,选择菜单中的“添加库…”,选择添加外部库:
    添加外部库
    然后选择之前编译好的liblua.a库文件:
    liblua.a文件
    添加完成后,会在工程文件中自动生成相应的代码:
    库文件代码
    要想使用liblua.a库,工程中需要添加其4个头文件:lualib.h,lua.h,lauxlib.h,和luaconf.h。然后程序中包含头文件:
    包含头文件
    也可以直接包含“lua.hpp”文件,然后在main函数中编写测试代码。这里偷个懒,直接用人家博客的测试代码,https://www.cnblogs.com/IT-BOY/p/3570764.html,完整代码如下:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    lua_State *lu = luaL_newstate();
    luaL_openlibs(lu);

    // 执行内存脚本
    std::string str = "print (\"Hello world!!!!\")";
    luaL_loadbuffer(lu, str.c_str(), str.length(), "line");
    lua_pcall(lu, 0, 0, 0);

    return a.exec();
}

虽然有一些警告,但只是说明库版本比链接版本更新,不影响正常使用:
编译警告
点击运行后,终端输出“Hello world”,说明测试正常:
运行结果

  1. 测试libtolua.a库
    这次新建一个GUI工程:
    新建GUI工程
    一路默认即可,注意不需要生成mainwindow.ui文件:
    去掉ui文件
    创建后在工程中删除mainwindow.h和mainwindow.cpp文件,因为用不到他们。仿照上一步测试liblua.a库那样在工程中分别添加liblua.a和libtolua.a文件。除了上次的4个头文件,这次还要加上"tolua.h"文件,完整的项目结构如下图:
    项目结构
    然后在main.cpp文件中添加测试代码,这里参考博文https://www.cnblogs.com/IT-BOY/p/3572803.html
    完整的代码如下:
#include "lua.hpp"
#include "tolua.h"
#include <QWidget>
#include <QApplication>
#include <QFile>
#include <QDebug>
#include <QDir>

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);

    QString path = QDir::currentPath();
    qDebug() << path;

    // 读取资源文件
    QFile file("test.lua");
    file.open(QIODevice::ReadOnly | QIODevice::Text);

    // 注意,笔者使用的事UTF-8编码,如果是ANSI编码可以去掉这句
    QTextStream in(&file);
    in.setCodec("UTF-8");

    // Lua加载并执行脚本
    luaL_loadbuffer(lu, str.toLocal8Bit().data(), str.length(), "line");
    lua_pcall(lu, 0, 0, 0);

    return a.exec();
}

然后编译项目,不幸报错了:
编译错误
是由于“Q_INIT_RESOURCE(resources);”这行代码导致错误,因为工程中没有用到资源文件,将其注释掉即可,再次编译成功。运行又出错了,并没有像博文里说的那样打开QWidget窗口:
运行错误
看错误提示,原来是“test.lua”文件打开失败,忘记写这个脚本文件了。创建一个test.lua文件,写下代码:

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

把它放在编译目录下,再次运行,还是那个错误。难道路径不对,实在搞不清Mac下的Qt执行文件路径在哪里,干脆写代码输出当前路径:

QString path = QDir::currentPath();
qDebug() << path;

再运行,程序输出:

"/Users/dev/Desktop/program/Qt5/build-ToLuaTest-Desktop_Qt_5_11_0_clang_64bit-Debug/ToLuaTest.app/Contents/MacOS"

原来在这里,打开build-ToLuaTest-Desktop_Qt_5_11_0_clang_64bit-Debug目录发现ToLuaTest.app文件:
ToLuaTest.app文件
得右键该文件“显示包内容”才能进入目录中,把test.lua文件放入ToLuaTest.app/Contents/MacOS目录中:
包目录中
这次再运行程序,终于看到久违的窗口了,大功告成:
运行窗口

猜你喜欢

转载自blog.csdn.net/xinxin_2011/article/details/84640541
Qt5