使用Luabind处理事件回调

Jon*_*tan 27 c++ lua luabind

我正在将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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Lua做同样事情的梦想API看起来像这样:

b = wx.Button (frm, -1, "Click me")
b.on_click = function (ev)
    print ("Button clicked")
end
Run Code Online (Sandbox Code Playgroud)

或者,允许多个事件处理程序:

b.on_click:add (function (ev)
    print ("Button clicked again ...")
end)
Run Code Online (Sandbox Code Playgroud)

如果不可能,这样的东西更类似于C++ API:

b.bind (wx.EVT_COMMAND_BUTTON_CLICKED, function (ev)
    print ("Yet again")
end)
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何使用Luabind实现这一点,而不为我想要使用的wxWidgets-library中的每个类编写包装类.

有什么建议?

或许Luabind可以通过某种方式自动创建辅助类(比如说"wxLuaEventPropagator")吗?因此,wxButton类为每个事件都有一个嵌套的wxLuaEventPropagator类("on_click",依此类推).再一次,我不想为我使用的wxWidgets中的每个类创建包装类,因为有一吨.

(是的,我知道wxLua)

Con*_*501 2

您可以使用 luabind::object 来做到这一点。

一个示例类: class MyClass { public: 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 lua 代码中,它将是:

myClass = MyClass()

myClass:SetEventFunction( function (x, y)
    print ("The new mouse position is", x, y)
end)
Run Code Online (Sandbox Code Playgroud)

要为一个事件提供多个函数,您可以std::vector使用luabind::object