2013-02-10 94 views
2

當使用C++在gtk +中編程時,是否有任何理由使用特殊綁定?作爲在C++是C的超集,爲什麼不能與呼叫使用回事件以及C風格的GTK +對象的靜態成員類中的一類封裝成這樣:混合gtk +和C++

class MainWindow{ 
    public: 
     MainWindow(void); 
     GtkWidget* window; 
     GtkWidget* button; 
     static void signals(GtkWidget *widget, GdkEventButton *event, gpointer callback_data); 
     static gboolean onDelete(GtkWidget *widget, GdkEvent *event, gpointer data); 
     static void onDestroy(GtkWidget *widget, gpointer data); 
     /* GtkWidget* canvas; 
     GtkWidget* items; */ 

    }; 

和信號連接完成在施工:

MainWindow::MainWindow(){ 
// Create widgets 
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
     button = gtk_button_new_with_label("Push the button."); 
// Connect widget signals 
     g_signal_connect(G_OBJECT(button), "button_press_event", G_CALLBACK(signals), NULL); 
// Add widgets to main window (pack multiple widgets) 
     gtk_container_add(GTK_CONTAINER(window), button); 
// Show window 
     gtk_widget_show_all(window); 
// Connect Main Window Signals 
     g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(onDelete), NULL); 
     g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(onDestroy), NULL); 

}

然後,只需創建設立GTK +來電之後在主類:

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

    // initialize GTK 
     gtk_init(&argc, &argv); 
     gdk_rgb_init(); 
    // Create Main Window... 
     MainWindow win; 
    // Listen 
     gtk_main(); 
     return 0; 
     } 

構造函數可以獲取初始大小和位置以及其他選項的參數...

我是否讓這個過於簡單或者是我讀過的所有其他東西使它太難了?

+4

當然你可以使用C綁定。像gtkmm這樣的C++綁定的重點在於它們可能更好地集成到C++程序中。 – us2012 2013-02-10 19:34:48

+3

您必須更多地觀察對象的生命週期以避免內存泄漏,並且類型安全性較低,因此需要更多的運行時錯誤。還有更多的樣板,所以代碼的可讀性會降低。但從技術上講,它可以正常工作,但我永遠不會推薦它。 – ergosys 2013-02-10 20:15:37

回答

5

你可以這樣做。

如果你喜歡C++接口,GTK也已經被賦予了C++包裝。它的名字叫gtkmm

+0

您也可以使用Gtk C++類對象的' - > gobj()'成員直接訪問C對象。並以這種方式使用與C++包裝器混合的C API(https://developer.gnome.org/gtkmm-tutorial/stable/sec-basics-gobj-and-wrap.html.en)。 – gauteh 2014-05-28 19:37:49