当存在GTK_GL_AREA时,GTK窗口变黑

问题描述 投票:0回答:1

我正在使用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中绘制了一个多维数据集。如果需要,我也将发布它。

shot1enter image description here

我正在使用GTK3构建GUI,并将GTK_GL_AREA放入其中。该GTK_GL_AREA连接到一些“渲染”和“实现”信号。无论如何,当我启动GUI时,窗口的某些部分会变成黑色...

c++ user-interface opengl gtk3 glade
1个回答
0
投票

尝试与其他程序一起运行。一些解析器无法解释地中断,拥有另一个解析器总是好事。您也可以尝试更新所述解析器

© www.soinside.com 2019 - 2024. All rights reserved.