27

Luaを使用したスクリプトをアプリケーションに追加しているので、GUIツールキットのバインディングを実装する必要があります。私たちが使用するツールキットはwxWidgetsです。

私はLua5.1とluabind0.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)

ただし、使用したいwxWidgets-libraryのすべてのクラスにラッパークラスを記述せずに、Luabindを使用してこれを実装する方法がわかりません。

助言がありますか?

おそらく、Luabindは何らかの方法でヘルパークラス(「wxLuaEventPropagator」など)を自動的に作成できますか?そのため、wxButtonクラスには、イベントごとにネストされたwxLuaEventPropagatorクラスがあります(「on_click」など)。繰り返しになりますが、使用するwxWidgetsのすべてのクラスにラッパークラスを作成する必要はありません。これは、大量のクラスがあるためです。

(はい、私はwxLuaを知っています)

4

1 に答える 1

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

lua コードでは、次のようになります。

myClass = MyClass()

myClass:SetEventFunction( function (x, y)
    print ("The new mouse position is", x, y)
end)

イベントに複数の関数を持たせるには、次を使用できstd::vectorますluabind::object

于 2011-05-26T07:20:19.953 に答える