2010-11-04 35 views
2

我使我的界面与林间空地。很棒。 我写了一个小小的主函数,它调用gtkbuilder并呈现glade文件中的所有内容。我错过了与glade 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

你不会错过某些明显的东西。看起来gtkmm不提供C++版本的gtk_builder_connect_signals()函数,这就是你如何在C中做的。我已经做了一些Google搜索,但是我不知道为什么他们会把它排除在外。

您可以直接访问C函数是这样的:

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

非常感谢。很高兴知道我不会疯了。 – stu 2010-11-04 20:33:40

+0

看来你所要做的就是将它连接到一个独立的函数,就像一个不属于类的函数一样。我明白了为什么将它附加到一个类会是一个问题,实际上,这是我遇到的确切问题,您没有获取回调的对象的源代码。 – stu 2010-11-04 20:34:43

+0

我想象一下将它绑定到C++函数将是一个PIA。我想我可以打电话给gtk_builder_connect_signals(),如果我让所有的信号处理程序extern“C”{} – stu 2010-11-04 20:35:28

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 ::窗口):

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

我发现这在官方gtkmm manual一个月前,并在我的GUI应用程序中成功使用它。

我希望这会有所帮助。

相关问题