gtkd addOnClicked/g_信号_连接失败

gtkd addOnClicked/g_信号_连接失败,d,gtkd,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()) ./tes

我期待着建立一个按钮,加载功能“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_信号连接(NewItem_按钮,“单击”,g_回调(NewItem),NULL);,但我相信我会使用NewItem\u按钮;在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);
}

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

委托和函数之间的区别在于委托也有上下文。 您可以在此处阅读有关函数和委托的更多信息:

您还缺少函数需要采用
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);
}
用于删除的
文档