2010-11-04 53 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應用程序中成功使用它。

我希望這會有所幫助。

相關問題