c++ - 使用 OpenGL 编译 GTK+

标签 c++ c opengl gtk3

上下文:我正在学习使用 GTK+ 进行 GUI 开发。我还想在 GUI 上画直线和圆。所以我从教程开始,但我被 GtkGLArea 的部分困住了。我正在遵循 GTK+ documentation 中给出的代码

错误:

glTrial.cpp:32:13: error: variable or field ‘on_realize’ declared void
 on_realize (GtkGLarea *area)
             ^
glTrial.cpp:32:13: error: ‘GtkGLarea’ was not declared in this scope
glTrial.cpp:32:24: error: ‘area’ was not declared in this scope
 on_realize (GtkGLarea *area)

我相信我没有正确编译,编译器无法找到正确的 header 。

编译:

g++ -std=c++14 \`pkg-config --cflags gtk+-3.0\` -o glTrial glTrial.cpp \`pkg-config --libs gtk+-3.0\` 

代码:

#include <gtk/gtk.h>
#include <gtkgl-2.0/gtkgl/gdkgl.h>
#include <gtkgl-2.0/gtkgl/gtkglarea.h>

static void
print_hello (GtkWidget *widget,
         gpointer user_data)
{
  g_print ("Hello World\n");
}

static gboolean
render (GtkGLArea *area, GdkGLContext *context)
{
  // inside this function it's safe to use GL; the given
  // #GdkGLContext has been made current to the drawable
  // surface used by the #GtkGLArea and the viewport has
  // already been set to be the size of the allocation

  // we can start by clearing the buffer
  //glClearColor (0, 0, 0, 0);
  // glClear (GL_COLOR_BUFFER_BIT);

  // draw your object
  // draw_an_object ();

  // we completed our drawing; the draw commands will be
  // flushed at the end of the signal emission chain, and
  // the buffers will be drawn on the window
  return TRUE;
}
static void
on_realize (GtkGLarea *area)
{
  // We need to make the context current if we want to
  // call GL API
  gtk_gl_area_make_current (area);

  // If there were errors during the initialization or
  // when trying to make the context current, this
  // function will return a #GError for you to catch
  if (gtk_gl_area_get_error (area) != NULL)
    return;

  // You can also use gtk_gl_area_set_error() in order
  // to show eventual initialization errors on the
  // GtkGLArea widget itself
  GError *internal_error = NULL;
  init_buffer_objects (&error);
  if (error != NULL)
    {
      gtk_gl_area_set_error (area, error);
      g_error_free (error);
      return;
    }

  init_shaders (&error);
  if (error != NULL)
    {
      gtk_gl_area_set_error (area, error);
      g_error_free (error);
      return;
    }
}

static void
activate (GtkApplication* app,
      gpointer user_data)
{
  GtkWidget *window;
  GtkWidget *grid;
  GtkWidget *button;
  GtkWidget *gl_area =gtk_gl_area_new();

  /* Create a new window, and set its title */
  window = gtk_application_window_new(app);
  gtk_window_set_title(GTK_WINDOW(window), "Window");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  //  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

  /* Here we construct the container that is going to pack the buttons*/
  grid = gtk_grid_new();

  /* Pack the container in the window */
  gtk_container_add (GTK_CONTAINER (window), grid);


  button = gtk_button_new_with_label ("Quit");
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);

  gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 2, 1);

  button = gtk_button_new_with_label ("Hello");
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (print_hello), NULL);

  gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1);

  /* Trial for GL area*/
  g_signal_connect (gl_area, "render", G_CALLBACK(render), NULL);
  gtk_grid_attach (GTK_GRID (grid), gl_area, 0, 2, 10, 10);

  gtk_widget_show_all (window);
}


int
main (int argc,
      char **argv)
{
  GtkApplication *app;
  int status;
  g_application_run (G_APPLICATION (app), argc, argv);
  //  app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
  return status;

}

最佳答案

根据快速谷歌搜索,您正在寻找GtkGLArea,请注意大写A。 – 德哈斯

关于c++ - 使用 OpenGL 编译 GTK+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948158/

相关文章:

c++ - 在 C++ 中初始化结构体中数组的正确方法

c - 使用GTK+2编译C代码调用octave函数时出现错误

c - calloc 的两个参数

c - 用 C 打印素数

OpenGL 2D Evaluator Mesh 无法设置更大

c++ - 是原始类型转换,在内存中创建一个新对象吗?

c++ - ‘>’ 标记之前的预期主表达式

java - 如何在lwjgl中绑定(bind)缓冲区

c++ - 重载==递归比较两个链表

opengl - glDrawArrays 的计数可能超过缓冲区大小