2017-05-31 59 views
-1

我正在學習GTK +並將其作爲一個練習,我正在試圖製作一個簡單的GUI文本編輯器。這裏被簡化和我的代碼較短的版本,說明我有這個問題:GTK +'GTK_IS_CONTAINER'失敗

#include <gtk/gtk.h> 

class App 
{ 
protected: 
    GtkWidget *window; 
    GtkTextBuffer *buffer; 
    GtkWidget *view; 
}; 

class Window: public App 
{ 
public: 
    Window() 
    { 
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
     gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); 
     g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), 0); 
    } 
    void show() 
    { 
     gtk_widget_show_all(window); 
    } 
}; 

class Editor: public App 
{ 
public: 
    Editor() 
    { 
     view = gtk_text_view_new(); 
     buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); 
     gtk_text_buffer_set_text(buffer, "TEXT", -1); 
     add(); 
    } 
private: 
    void add() 
    { 
     gtk_container_add(GTK_CONTAINER(window), view); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv); 
    Window *w = new Window(); 
    Editor *e = new Editor(); 
    w->show(); 
    delete w; 
    delete e; 
    gtk_main(); 
} 

程序編譯和運行,但它應該顯示在屏幕上可編輯的小部件爲「TEXT」寫進去,這沒有關係「T。 在終端中運行此程序會顯示此消息:(test.o:23861): Gtk-CRITICAL **: gtk_container_add: assertion 'GTK_IS_CONTAINER (container)' failed。 我的問題是什麼導致這種情況,以及我如何解決這個問題。

+1

不知道任何關於* gtk *,我會說你在哪裏做'GTK_CONTAINER(window)','window'可能不是一個容器 – Justin

+0

歡迎來到Stack Overflow。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

@Justin不,窗戶是容器。 – andlabs

回答

1

兩個class Windowclass Editor實例變量是從class App繼承的副本獨特。你不能共享這樣的數據; Window::windowEditor::window是不同的變量,並且Editor::window從未被初始化。

這是繼承如何在C++中工作的基本部分。如果你對此不熟悉,你應該閱讀關於這個主題的C++書籍或教程。

如果你是熟悉,只是忘了,那麼你應該做的事情,如果你走這路線是隻是class App在它所有的程序邏輯,並有專門main()工作與class App一個實例。您還應該考慮gtkmm,它是GTK +之上的C++包裝器,它允許您像使用C++一樣使用GTK +。

+0

謝謝,我認爲'window'變量和'Window'和'Editor'類是一樣的。 – Vuk