我正在编写我的第一个gtk程序,使用gtkmm和glade。 我做了一个filechooserbutton,它有一个叫做文件集的信号 所以我把它设置为我所假设的是我希望它在选择文件时调用的函数名。 但后来我在这里看到: http://library.gnome.org/devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.en
他们手动获取对话框小部件并在代码中设置按钮信号处理程序。 这是正确的方法吗?
虽然我在这里任何好例子的链接都会很方便,但它们似乎很少见。感谢。
答案 0 :(得分:0)
我在另一个stackoverflow问题中找到了我的问题的答案作为事后的想法。
但我不记得是哪一个。
答案似乎是您必须以编程方式将信号处理程序添加到代码中的窗口小部件中,gtkbuilder不会为您执行此操作。
答案 1 :(得分: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() {}
修改强>
基本上*这是你将信号处理函数调用到的对象。
这就是我的主要观点:
int main(int argc, char **argv) {
Gtk::Main kit(argc, argv);
MainWindow main_window;
kit.run(*main_window.window);
return 0;
}
MainWindow
基本上是一个包装GtkWindow并定义小部件的类,a。 LA:
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
}
};
希望这有帮助!