我创建了一个GtkFixed对象,并通过gtk_container_add将其放入GtkEventBox(当然,它会破坏前一个孩子)。这种方式在Windows上运行良好,但在Mac上它崩溃了。
堆栈跟踪向我显示应用程序崩溃了gtk_get_parent。我试过用户set_parent程序,但它也崩溃了:
[debug][New Thread 0x1b0f of process 88699]
[debug]Program received signal SIGSEGV, Segmentation fault.
[debug]0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
[debug]>>>>>>cb_gdb:
Program received signal SIGSEGV, Segmentation fault.
In gtk_widget_set_parent () (/usr/local/lib/libgtk-3.0.dylib)
[debug]> bt 30
[debug]#0 0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
代码在主线程中运行,并在“实现”Window的回调中运行。相同。
代码是:
void main_view_reset_list_view(GtkWidget* list_view, GtkWidget* new_item)
{
GtkEventBox* eb = GTK_EVENT_BOX(list_view);
GtkBin* bin = GTK_BIN(list_view);
GtkContainer* container = GTK_CONTAINER(list_view);
GtkWidget* subview;
subview = gtk_bin_get_child(bin);
if (subview)
{
gtk_container_remove(container, subview);
gtk_widget_unparent (subview);
gtk_widget_destroy(subview);
}
gtk_widget_set_parent(new_item, container); // crash
GtkWidget* parent = gtk_widget_get_parent(container);
GtkWidget* parent2 = gtk_widget_get_parent(new_item); // 0 on windows, crash on mac
if (new_item)
{
gtk_container_add(container, new_item);
gtk_widget_show(new_item);
}
gtk_widget_show(list_view);
}
UPD: set_parent使控件在windows上以某种方式消失了
答案 0 :(得分:0)
我已经跟踪了gtk和glib源代码,并认为G_IS_OBJECT()失败了,这很奇怪。这个post让我想起这个问题与指针有关。我调试了我的代码并发现它是真的。
GtkWidget* create_widget()
{
return gtk_fixed_new(); // result points to 0x1018bf830
}
void refresh_widgets()
{
GtkWidget* w = create_widget(); // w points to 0x18bf830
}
我之前实际上遇到过这种问题,因此所有返回指针的代码都已更改:
char* generate_string();
到
void generate_string(char** out);
因此,为了解决我的问题,我必须以这种方式提供正确的指针。像:
void create_widget(GtkWidget** out);
UPD:我注意到指针之间存在差异。简而言之,不知何故,它们会在返回时在64位系统上被修剪为32位。
UPD2:最后,我做了所有更改,它就是这样。