我错过了使用glade gtkbuilder和连接信号的明显东西。救命?

时间:2010-11-04 16:05:12

标签: gtk glade gtkmm gtkbuilder

我用林间空地制作界面。效果很好。 我写了一个小的主要函数,它调用gtkbuilder并渲染glade文件中的所有内容。

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实例化。

我只是不明白。帮助

2 个答案:

答案 0 :(得分:4)

你不会错过一些明显的东西。似乎gtkmm没有提供gtk_builder_connect_signals()函数的C ++版本,这就是你在C中的表现。我已经做了一些谷歌搜索,但我无法弄清楚为什么他们会离开它进行。

您可以直接访问C函数:

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");
gtk_builder_connect_signals(builder->gobj(), callback_data);

答案 1 :(得分: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的Core类中):

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

我在几个月前在官方gtkmm manual找到了这个,并在我的GUI应用程序中成功使用它。

我希望这会有所帮助。