0

私はgtkmmとgladeを使用して、最初のgtkプログラムを書いています。私は filechooserbutton を作成しましたが、それには file-set というシグナルがあります。そのため、ファイルが選択されたときに呼び出したい関数名であると想定しているものに設定しました。しかし、ここに表示されます: http://library.gnome.org/devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.en

ダイアログ ウィジェットを手動で取得し、コードでボタン シグナル ハンドラーを設定していること。それを行う正しい方法はどれですか?

そして、私がここにいる間、良い例へのリンクは便利ですが、それらはほとんどないようです. ありがとう。

4

2 に答える 2

0

私の質問への答えは、別のスタックオーバーフローの質問で後付けとして見つけました。

でも、どれだったか覚えていません。

答えは、シグナル ハンドラーをコード内のウィジェットにプログラムで追加する必要があるようです。gtkbuilder はそれを行いません。

于 2010-11-04T18:41:18.350 に答える
0

これが私がやった方法です:

// 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
    }

};

お役に立てれば!

于 2010-11-27T16:17:39.660 に答える