Devo allegare manualmente un gestore di segnale gtk quando ho specificato il nome della funzione a Glade?

StackOverflow https://stackoverflow.com/questions/4089077

  •  28-09-2019
  •  | 
  •  

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top