GTK+ 'GTK_IS_CONTAINER'失败

GTK+ 'GTK_IS_CONTAINER' failed

本文关键字:失败 CONTAINER GTK GTK+ IS      更新时间:2023-10-16

我正在学习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();
}

该程序编译并运行,但应在屏幕上显示带有文本"文本"的屏幕可编辑的小部件,但事实并非如此。在终端中运行此程序显示此消息:(test.o:23861): Gtk-CRITICAL **: gtk_container_add: assertion 'GTK_IS_CONTAINER (container)' failed。我的问题是是什么原因导致了这一点,以及如何解决它。

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

这是遗传在C 中工作的基本部分。如果您不熟悉这一点,则应阅读有关该主题的C 书籍或教程。

如果您熟悉这一点并且只是忘记了,那么如果您走下去的路线,您应该做的是class App都具有所有程序逻辑,并且main()专门与class App实例一起工作。您还应该考虑GTKMM,它是GTK 顶部的C 包装器,它使您可以与GTK 一起工作,就好像是C 一样。