gtkd addOnClicked / g_signal_connect失败

时间:2014-05-27 03:47:00

标签: d gtkd

我希望设置一个按钮,在按下按钮时加载“NewItem”功能。当我尝试编译时,我收到消息:

./test.d:20: Error: function gtk.Button.Button.addOnClicked (void delegate(Button) dlg, 
GConnectFlags connectFlags = cast(GConnectFlags)0) is not callable using argument types 
(void function())
./test.d:20: Error: cannot implicitly convert expression (& NewItem) of type void 
function() to void delegate(Button)

在C下(我正在重写D中的C程序),我只想使用g_signal_connect(NewItem_button,“clicked”,G_CALLBACK(NewItem),NULL);但我相信我会使用NewItem_button.addOnClicked( &安培;的newitem);在D。

我的代码是:

void NewItem()
{
    //Create a new window to add new items.
}

Grid config_menu()
{
    Button tax_button=new Button("Set Tax Rate");

    Button NewItem_button=new Button("New Menu Item");
    NewItem_button.addOnClicked(&NewItem);

    Grid admin_grid=new Grid();
    admin_grid.setColumnSpacing(6);
    admin_grid.setRowSpacing(3);

    admin_grid.attach(tax_button, 0,0,1,1);
    admin_grid.attach(NewItem_button, 1,0,1,1);

    return(admin_grid);
}

1 个答案:

答案 0 :(得分:2)

addOnClicked需要void delegate(Button) dlg类型的参数,同时为其提供void function()类型的参数。

委托和函数之间的区别在于委托也有上下文。 您可以在此处阅读有关函数和代理的更多信息:http://ddili.org/ders/d.en/lambda.html

您还错过了您的功能需要采用Button类型的参数。

为了让您的示例有效,您需要将您的功能转换为代理,您需要:

void NewItem(Button b) // your function needs to take a Button parameter
{
    //Create a new window to add new items.
}

Grid config_menu()
{
    Button tax_button=new Button("Set Tax Rate");

    Button NewItem_button=new Button("New Menu Item");
    NewItem_button.addOnClicked(toDelegate(&NewItem)); // convert the function to a delegate

    Grid admin_grid=new Grid();
    admin_grid.setColumnSpacing(6);
    admin_grid.setRowSpacing(3);

    admin_grid.attach(tax_button, 0,0,1,1);
    admin_grid.attach(NewItem_button, 1,0,1,1);

    return(admin_grid);
}

toDelegate的文档:http://dlang.org/phobos/std_functional.html#.toDelegate