0

我正在编写我的第一个 gtk 程序,使用 gtkmm 和 glade。我制作了一个文件选择器按钮,它有一个名为 file-set 的信号,所以我将其设置为我假设的函数名称,我希望它在选择文件时调用它。但后来我在这里看到:http: //library.gnome.org/devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.en

他们手动获取对话框小部件并在代码中设置按钮信号处理程序。哪种方法是正确的?

虽然我在这里,任何指向好例子的链接都会很方便,但它们似乎很少而且相差甚远。谢谢。

4

2 回答 2

0

我在另一个 stackoverflow 问题中找到了我的问题的答案作为事后的想法。

但我不记得是哪一个了。

答案似乎是您必须以编程方式将信号处理程序添加到代码中的小部件,gtkbuilder 不会为您完成。

于 2010-11-04T18:41:18.350 回答
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() {}

编辑:

基本上 *this 是您将在其上调用信号处理程序函数的对象。

这是我的主要外观:

int main(int argc, char **argv) {

    Gtk::Main       kit(argc, argv);
    MainWindow      main_window;

    kit.run(*main_window.window);

    return 0;
}

MainWindow基本上是一个包装 GtkWindow 并定义小部件的类,a. 拉:

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
    }

};

希望这可以帮助!

于 2010-11-27T16:17:39.660 回答