Devo allegare manualmente un gestore di segnale gtk quando ho specificato il nome della funzione a Glade?
Domanda
Sto scrivendo il mio primo programma gtk, utilizzando gtkmm e radura. Ho fatto un filechooserbutton e ha un file-set di segnale di chiamata Così mi sono messo a che quello che presumo è il nome della funzione lo voglio chiamare quando si sceglie il file. Ma poi vedo qui: http://library.gnome.org /devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.en
Quello che stanno ottenendo manualmente il widget di dialogo e l'impostazione di un gestore di segnale pulsante nel codice. Qual è il modo giusto per farlo?
E mentre io sono qui alcun legame con buoni esempi sarebbero a portata di mano, sembrano essere pochi e rari. Grazie.
Soluzione
Ecco come ho fatto:
// 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() {}
modifica
In sostanza l'* questo è l'oggetto su cui verrà chiamata la funzione di vostro gestore di segnale.
Questo è ciò che i miei principali appare come segue:
int main(int argc, char **argv) {
Gtk::Main kit(argc, argv);
MainWindow main_window;
kit.run(*main_window.window);
return 0;
}
MainWindow
è fondamentalmente una classe che avvolge GtkWindow e definisce i widget, 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
}
};
Spero che questo aiuti!
Altri suggerimenti
ho trovato la risposta alla mia domanda come un ripensamento in un'altra domanda StackOverflow.
Ma io non ricordo quale fosse.
La risposta sembra essere che è necessario aggiungere a livello di codice il gestore di segnale al widget nel codice, il GtkBuilder non lo farà per voi.