2

我用 glade 制作我的界面。效果很好。我编写了一个很小的 ​​main 函数,它调用 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 实例化。

我只是不明白。帮助?

4

2 回答 2

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);
于 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 回答