Нужно ли вручную прикреплять обработчик сигнала gtk, когда я указал имя функции в поляне?

Я пишу свою первую программу gtk, используя gtkmm иglade. Я сделал кнопку выбора файла, и у нее есть сигнал, называемый набором файлов. Поэтому я установил это, как я полагаю, это имя функции, которую я хочу, чтобы она вызывала при выборе файла. Но тут я вижу: http://library.gnome.org/devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.en

Что они вручную получают виджет диалога и устанавливают обработчик сигнала кнопки в коде. Как правильно это сделать?

И хотя я здесь, любые ссылки на хорошие примеры были бы кстати, их, кажется, немного и далеко друг от друга. Спасибо.


person stu    schedule 03.11.2010    source источник


Ответы (2)


Вот как я это сделал:

// create the UI
refUI = Gtk::Builder::create();
refUI->add_from_file(grq::GLADE_FILE);

// grab your widget
refUI->get_widget("but_new", but_new); // Gtk::ToolButton *but_new;
but_new->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_new_game));

// your signal handler looks something like this :)
void MainWindow::on_new_game() {}

изменить:

По сути, *this — это объект, для которого вы будете вызывать функцию вашего обработчика сигнала.

Вот как выглядит мой основной:

int main(int argc, char **argv) {

    Gtk::Main       kit(argc, argv);
    MainWindow      main_window;

    kit.run(*main_window.window);

    return 0;
}

MainWindow — это, по сути, класс, обертывающий GtkWindow и определяющий виджеты, а. ля.:

class MainWindow
{

private:
Glib::RefPtr<Gtk::Builder> refUI;

//
// Widgets
//

Gtk::ToolButton *but_about;

public:

// The window. This is public so we can hook into events and
// call kit.run(window) against it, if needed.
Gtk::Window *window;


MainWindow()
{
    // Load the data for this window and it's widgets.
    refUI = Gtk::Builder::create();
    refUI->add_from_file(grq::GLADE_FILE);


    // The window
    refUI->get_widget("main_window", window);


    // Widgets              
    refUI->get_widget("but_about", but_about);
    but_about->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_about));

            ...

}


virtual ~MainWindow()
{
    if (window != NULL)
    {
        delete window; // Frees all the children for the window, too.
    }
}

    virtual void on_about()
    {
            // stuff
    }

};

Надеюсь это поможет!

person Victor Parmar    schedule 27.11.2010
comment
library.gnome.org/devel/gtkmm- tutorial/unstable/, хотя знать, к какому сигналу подключаться, тоже непросто :S - person Victor Parmar; 27.11.2010
comment
Верно, я видел это во множестве мест... Чего я не понимаю, так это *этой части. - person stu; 29.11.2010
comment
Что такое «это» в данном контексте? - person stu; 29.11.2010
comment
Хорошо, я вижу, что ты делаешь. Так что логически это глобальная функция, которую вы привязали к классу. Думаю, именно так это и будет сделано. Мне просто кажется, что С++ не очень чистый. Но это должно быть так, как должно быть. Спасибо. - person stu; 29.11.2010
comment
Если подумать, это не так уж и плохо. Он связывает вещи вместе в объектах, я еще не заработал, но буду. Я пытаюсь не думать о том, что должно происходить в mem_fun. - person stu; 29.11.2010

Я нашел ответ на свой вопрос как запоздалую мысль в другом вопросе о стеке.

Но я не помню, какой именно.

Ответ, кажется, заключается в том, что вам нужно программно добавить обработчик сигнала к виджету в вашем коде, gtkbuilder не сделает это за вас.

person stu    schedule 04.11.2010