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 Window
和class Editor
中继承自class App
的实例变量的副本是唯一的。您不能那样共享数据; Window::window
和 Editor::window
是不同的变量,Editor::window
永远不会被初始化。
这是 C++ 中继承工作原理的基本部分。如果您对此不熟悉,则应阅读有关该主题的 C++ 书籍或教程。
如果您对此很熟悉,只是忘记了,那么如果您沿着这条路走下去,您应该做的就是让 class App
包含所有程序逻辑,并让 main()
专门与 class App
的一个实例一起工作。您还应该考虑 gtkmm,它是 GTK+ 之上的 C++ 包装器,允许您像使用 C++ 一样使用 GTK+。
我正在学习 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 Window
和class Editor
中继承自class App
的实例变量的副本是唯一的。您不能那样共享数据; Window::window
和 Editor::window
是不同的变量,Editor::window
永远不会被初始化。
这是 C++ 中继承工作原理的基本部分。如果您对此不熟悉,则应阅读有关该主题的 C++ 书籍或教程。
如果您对此很熟悉,只是忘记了,那么如果您沿着这条路走下去,您应该做的就是让 class App
包含所有程序逻辑,并让 main()
专门与 class App
的一个实例一起工作。您还应该考虑 gtkmm,它是 GTK+ 之上的 C++ 包装器,允许您像使用 C++ 一样使用 GTK+。