1. 程式人生 > >Mac下在Qt5裡面測試liblua.a和libtolua.a庫

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目錄中:
包目錄中
這次再執行程式,終於看到久違的視窗了,大功告成:
執行視窗