GTK+ 'GTK_IS_CONTAINER' 失败

GTK+ 'GTK_IS_CONTAINER' failed

我正在学习 GTK+,作为练习,我正在尝试制作一个简单的 GUI 文本编辑器。这是我的代码的简化版本,它说明了我遇到的问题:

#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",但事实并非如此。 运行 终端中的此程序显示此消息:(test.o:23861): Gtk-CRITICAL **: gtk_container_add: assertion 'GTK_IS_CONTAINER (container)' failed。 我的问题是造成这种情况的原因以及如何解决它。

class Windowclass Editor中继承自class App的实例变量的副本是唯一的。您不能那样共享数据; Window::windowEditor::window 是不同的变量,Editor::window 永远不会被初始化。

这是 C++ 中继承工作原理的基本部分。如果您对此不熟悉,则应阅读有关该主题的 C++ 书籍或教程。

如果您对此很熟悉,只是忘记了,那么如果您沿着这条路走下去,您应该做的就是让 class App 包含所有程序逻辑,并让 main() 专门与 class App 的一个实例一起工作。您还应该考虑 gtkmm,它是 GTK+ 之上的 C++ 包装器,允许您像使用 C++ 一样使用 GTK+。