我正在使用GTK3构建GUI,并在其中放置了GTK_GL_AREA
。
此GTK_GL_AREA
连接到某些“渲染”和“实现”信号。
无论如何,当我启动GUI时,只要将鼠标悬停在窗口上,窗口的某些部分就会变黑。然后,如果我将鼠标悬停在按钮小部件上,它们将再次显示,但窗口的中性部分仍为黑色。
如果我展开窗口,所有内容都会显示一段时间,但是如果将鼠标悬停在窗口上,它将再次变黑。
[当我不断重画GTK_GL_AREA
并调用gtk_gl_area_queue_render()
时这种现象变得更糟,而当我禁用GTK_GL_AREA signals.
时不会发生这种现象>
我附上一些screenshots以使您了解我上面描述的内容。
希望您能给我一些避免这种行为的提示。
PS。即使当我看到整个窗口时,我也需要在GTK上重叠另一个窗口,因为按下打印按钮后,它就在获取屏幕截图之前变成了黑色。
EDIT
:很抱歉没有向您显示代码以重现我的意思。以下是带有GTK_GL_AREA和两个按钮的简单代码。它可以编译,没有任何错误,但是当我将鼠标悬停在这些按钮之一上时,窗口的某些部分变为blank(在左图中,该窗口应如何显示,在右图中,当我通过该按钮时该窗口如何出现。鼠标在下部按钮上)。//file main.cpp //to compile -> g++ main.cpp -o main `pkg-config --cflags --libs gtk+-3.0` -lGL -lglfw -lglut -lGL -lGLU -lGLEW #include <iostream> #include <gtk/gtk.h> #include <gtk/gtkx.h> #include <GL/glew.h> /*Signals prototypes*/ void on_upper_button_clicked (GtkButton *b); void on_lower_button_clicked (GtkButton *b); void on_realize(GtkGLArea *area); gboolean render(GtkGLArea *area, GdkGLContext *context); /* Widgets declaration*/ GtkWidget *main_window; GtkWidget *upper_button; GtkWidget *lower_button; GtkGLArea *glarea; GtkBox *box_gl; /* GLADE builder*/ GtkBuilder *builder; int main(int argc, char *argv[]) { gtk_init(&argc, &argv); builder = gtk_builder_new_from_file("test.ui"); /* Widgets initialization*/ main_window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window")); upper_button = GTK_WIDGET(gtk_builder_get_object(builder, "upper_button")); lower_button = GTK_WIDGET(gtk_builder_get_object(builder, "lower_button")); glarea = GTK_GL_AREA(gtk_builder_get_object(builder, "glarea")); /*Signals connection*/ g_signal_connect(main_window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect (upper_button, "clicked", G_CALLBACK (on_upper_button_clicked), NULL); g_signal_connect (lower_button, "clicked", G_CALLBACK (on_lower_button_clicked), NULL); g_signal_connect (glarea, "realize", G_CALLBACK (on_realize), NULL); g_signal_connect (glarea, "render", G_CALLBACK (render), NULL); gtk_widget_show(main_window); /*gtk_main*/ gtk_main(); return 0; } void on_upper_button_clicked (GtkButton *b) { printf("UP\n"); } void on_lower_button_clicked (GtkButton *b) { printf("DOWN\n"); } void on_realize (GtkGLArea *area) { gtk_gl_area_make_current (GTK_GL_AREA (area)); return; } gboolean render(GtkGLArea *area, GdkGLContext *context) { gtk_gl_area_make_current (GTK_GL_AREA (area)); gdk_gl_context_make_current (context); glClearColor(0.0f, 0.0f, 0.4f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); return TRUE; }
这是用GLADE生成的* .ui代码。
<!-- file test.ui --> <?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.20.0 --> <interface> <requires lib="gtk+" version="3.20"/> <object class="GtkWindow" id="main_window"> <property name="can_focus">False</property> <child> <object class="GtkBox" id="box_gl"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> <object class="GtkButton" id="upper_button"> <property name="label" translatable="yes">UP</property> <property name="width_request">60</property> <property name="height_request">60</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> <signal name="clicked" handler="on_upper_button_clicked" swapped="yes"/> </object> </child> <child> <object class="GtkGLArea" id="glarea"> <property name="width_request">300</property> <property name="height_request">210</property> <property name="visible">True</property> <property name="app_paintable">True</property> <property name="can_focus">False</property> <signal name="realize" handler="on_realize" swapped="no"/> <signal name="render" handler="render" swapped="no"/> </object> </child> <child> <object class="GtkButton" id="lower_button"> <property name="label" translatable="yes">DOWN</property> <property name="width_request">60</property> <property name="height_request">60</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> <signal name="clicked" handler="on_lower_button_clicked" swapped="no"/> </object> </child> </object> </child> </object> </interface>
即使使用这个小代码,我也会遇到我在上面报告的问题。我有一个更复杂的代码,其中在GTK_GL_AREA中绘制了一个多维数据集。如果需要,我也将发布它。
我正在使用GTK3构建GUI,并将GTK_GL_AREA放入其中。该GTK_GL_AREA连接到一些“渲染”和“实现”信号。无论如何,当我启动GUI时,窗口的某些部分会变成黑色...
尝试与其他程序一起运行。一些解析器无法解释地中断,拥有另一个解析器总是好事。您也可以尝试更新所述解析器