2011-11-27 113 views
0

我有一个简单的Glade文件包含在C源代码中。下面是有趣的部分:GtkBuilder没有实现小部件?

int main(int argc, char *argv[]) { 
    GtkBuilder *builder; 
    gtk_init(&argc, &argv); 

    gdk_gl_init(&argc, &argv); 
    // ... some OpenGL specific initializations 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder, "gui.ui", NULL); 
    gtk_builder_connect_signals(builder, NULL); 

    window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window")); 
    drawingArea = GTK_wIDGET(gtk_builder_get_object(builder, "drawing_area")); 


    gtk_container_set_reallocate_redraws(GTK_CONTAINER(window), TRUE); 
    gtk_widget_set_gl_capability(drawingArea, glConfig, NULL, TRUE, GDK_GL_RGBA_TYPE); 
    // ... 
} 

如果我编译此,我得到这样的警告:

gtk_widget_set_gl_capability: assertion `!gtk_widget_get_realized (widget)' failed 

如果我现在使用的,而不是与此代码GtkBuilder libglade的(我保存的林间空地文件是兼容Libglade):

int main(int argc, char *argv[]) { 
    GladeXML *xml; 
    gtk_init(&argc, &argv); 

    gdk_gl_init(&argc, &argv); 
    // ... some OpenGL specific initializations 

    xml = glade_xml_new("gui.glade", NULL, NULL); 
    glade_xml_signal_autoconnect(xml); 

    window = glade_xml_get_widget(xml, "main_window"); 
    drawingArea = glade_xml_get_widget(xml, "drawing_area"); 


    gtk_container_set_reallocate_redraws(GTK_CONTAINER(window), TRUE); 
    gtk_widget_set_gl_capability(drawingArea, glConfig, NULL, TRUE, GDK_GL_RGBA_TYPE); 
    // ... 
} 

所有工作正常,没有错误出现。我已经尝试了几件事情来强制在GtkBuilder版本中实现drawing_area,但没有任何工作。我在这里忘了一些魔术吗?

+0

你为什么不尝试绑定到实现信号?只要在那里做所有的opengl启动东西。这比强迫窗口实现要好得多。 – Lalaland

+0

您正在阅读错误错误,问题是小部件已经实现。就像一个黑客(不要使用它作为一个修复)尝试在'gtk_widget_set_gl_capability'之前添加这两行:'if(gtk_widget_get_realized(drawingArea))gtk_widget_unrealize(drawingArea);'如果它有效,那么从那里寻找修复。你正在实现沿线的'drawingArea'。 AFAIK UI定义没有实现任何对象 –

+0

'GTK_wIDGET'?我猜这是行不通的:) –

回答

1

将顶层窗口的可见属性设置为False

我在过去的几周里遇到了同样的问题。我从glade2转换为使用gtkglext的glade3的glade xml文件不会接受gtk_widget_set_gl_capability调用。在阅读这篇文章并与一个正常运行的文件做了比较(感谢Jose Commins)之后,我意识到顶部窗口的可见属性设置为True。将其更改为False,一切正常。由于旧glade2文件中的所有顶层窗口都设置为True,所以这一定是默认设置。较新的软件将其设置为False。生成器必须在创建顶层窗口时初始化顶层窗口,并将其标记为可见,与旧的C代码等待直到明确调用创建函数的做法相反。