Mac下在Qt5裡面測試liblua.a和libtolua.a庫
編譯liblua.a和libtolua.a庫檔案請參考我上一篇博文Mac下編譯Lua和ToLua
-
安裝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檔案,製作一個替身檔案:
把製作好的替身檔案移動到應用程式目錄下:
這樣在啟動臺中就可以見到Qt5啟動快捷方式了 -
測試liblua.a庫
啟動Qt Creator,然後新建一個控制檯工程:
建立好之後,右鍵工程名稱,選擇選單中的“新增庫…”,選擇新增外部庫:
然後選擇之前編譯好的liblua.a庫檔案:
新增完成後,會在工程檔案中自動生成相應的程式碼:
要想使用liblua.a庫,工程中需要新增其4個頭檔案:lualib.h,lua.h,lauxlib.h,和luaconf.h。然後程式中包含標頭檔案:
也可以直接包含“lua.hpp”檔案,然後在main函式中編寫測試程式碼。這裡偷個懶,直接用人家部落格的測試程式碼,
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”,說明測試正常:
- 測試libtolua.a庫
這次新建一個GUI工程:
一路預設即可,注意不需要生成mainwindow.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檔案:
得右鍵該檔案“顯示包內容”才能進入目錄中,把test.lua檔案放入ToLuaTest.app/Contents/MacOS目錄中:
這次再執行程式,終於看到久違的視窗了,大功告成: