gtkd addOnClicked/g_signal_connect завершается ошибкой

Я ищу, чтобы настроить кнопку, которая загружает функцию "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 (я делаю переписывание программы на C на D), я бы просто использовал 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 ответ

Решение

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

Другие вопросы по тегам