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

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

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

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2010

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

// 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() {}

edit:

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

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

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

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

    kit.run(*main_window.window);

    return 0;
}

MainWindow - это класс, который обёртывает GtkWindow и определяет виджеты, a.la.:

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
    }

};

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

0 голосов
/ 04 ноября 2010

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

Но я не помню, какой это был.

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

...