2

私はグレードで私のインターフェースを作ります。よく働く。私は、gtkbuilder を呼び出してグレード ファイル内のすべてをレンダリングする小さな小さなメイン関数を作成します。

Gtk::Main kit(num, opts);
// Load the GtkBuilder file and instantiate its widgets:
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");

さらにうまく機能します。次に、ウィジェットを取得します

Gtk::Button *sf = 0;
builder->get_widget("button", sf);

それで?シグナルハンドラを接続するために私が見つけたすべての例は、gtkbuilder によってビルドされたものではありません。独自のクラスをインスタンス化してボタンを表現/処理/レンダリングする場合、シグナル ハンドラーをボタンに接続するのは簡単ですが、私は gtkbuilder を使用しており、ウィジェットにアタッチできる関数を作成する方法がわかりません。ボタン オブジェクトを作成したのは私ではなかったので、gtkbuilder が作成しました。

gtkbutton のサブクラスに関数を記述させてから、それを指すようにしますか? しかし、私のクラスは gtkbuilder によってインスタンス化されていません。

私はそれを理解していません。ヘルプ?

4

2 に答える 2

4

明らかな何かが欠けているわけではありません。gtkmm はgtk_builder_connect_signals()関数の C++ バージョンを提供していないようです。これは C で行う方法です。Google で少し検索しましたが、なぜ除外されるのかわかりません。

次のように C 関数に直接アクセスできます。

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");
gtk_builder_connect_signals(builder->gobj(), callback_data);
于 2010-11-04T19:01:44.133 に答える
3

次のような独自のボタン クラスを使用する必要があります。

#ifndef _MYBUTTON_H_
#define _MYBUTTON_H_

#include <gtkmm.h>
class MyButton : public Gtk::Button { 
  public:
    inline MyButton(BaseObjectType* cobject) : Gtk::Button(cobject) {};
  protected:
    // overwrite virtual void on_pressed() function of Gtk::Button
    void on_pressed() { /* do something */ };
};
#endif

今、あなたのメインコードのどこかに(Gtk::Windowのパブリックであるコアクラスに入れました):

MyButton *sf;
refBuilder_->get_widget_derived("button", sf);

数か月前に公式のgtkmm マニュアルでこれを見つけ、GUI アプリケーションでうまく使用しています。

これが役立つことを願っています。

于 2010-12-02T11:14:40.407 に答える