我正在将Lua脚本添加到我们的应用程序中,我需要为GUI工具包实现绑定。我们使用的工具包是wxWidgets。
我正在使用Lua 5.1和luabind 0.9.1,到目前为止它运行良好。但是,我不确定如何最好地处理事件。例如,如果你想创建一个按钮并在单击时打印一个字符串,你可以用C ++编写这样的东西
class MyClass : public wxFrame
{
MyClass (...)
{
b = new wxButton (this, -1, "Click me");
b->Bind (wxEVT_COMMAND_BUTTON_CLICKED, &MyClass::HandleButtonClick, this);
}
void HandleButtonClick (wxCommandEvent& ev)
{
wxMessageBox ("You clicked me");
}
}
我的梦想 - 在Lua中做同样事情的API看起来像这样:
b = wx.Button (frm, -1, "Click me")
b.on_click = function (ev)
print ("Button clicked")
end
或者,允许多个事件处理程序:
b.on_click:add (function (ev)
print ("Button clicked again ...")
end)
如果不可能,这样的东西更类似于C ++ API:
b.bind (wx.EVT_COMMAND_BUTTON_CLICKED, function (ev)
print ("Yet again")
end)
但是,我不知道如何使用Luabind实现这一点,而不为我想要使用的wxWidgets-library中的每个类编写一个包装类。
有什么建议吗?
也许Luabind会以某种方式自动创建帮助类(比如“wxLuaEventPropagator”)吗?因此,wxButton类为每个事件都有一个嵌套的wxLuaEventPropagator类(“on_click”,依此类推)。再一次,我不想为我使用的wxWidgets中的每个类创建包装类,因为它有一吨。
(是的,我知道wxLua)
答案 0 :(得分:2)
你可以使用luabind :: object来做到这一点。
一个例子: 类MyClass { 上市: void OnMouseMoved(int x,int y); void SetEventFunction(const luabind :: object& fn);
private:
luabind::object m_eventFunction;
};
void MyClass::SetEventFunction(const luabind::object &fn)
{
if(luabind::type(fn) == LUA_TFUNCTION)
{
cout << "A function" << endl;
m_eventFunction = fn;
}
else
{
cout << "Not a function" << endl;
}
}
void MyClass::OnMouseMoved(int x, int y)
{
if(m_eventFunction.is_valid())
{
luabind::call_function<void>(m_eventFunction, x, y);
}
}
在lua代码中,它将是:
myClass = MyClass()
myClass:SetEventFunction( function (x, y)
print ("The new mouse position is", x, y)
end)
要为某个活动提供多个功能,您可以使用std::vector
的{{1}}