简体   繁体   English

使用OpenGL编译GTK +

[英]Compilation for GTK+ using OpenGL

Context : I am learning development of GUI using GTK+. 上下文 :我正在学习使用GTK +开发GUI。 I also wanted to draw lines and circles on the GUI. 我还想在GUI上绘制直线和圆。 So I started with the tutorials and I am stuck with the part of GtkGLArea. 因此,我从教程开始,而对GtkGLArea的一面深感迷恋。 I am following the code given in the GTK+ documentation 我正在遵循GTK +文档中给出的代码

The error : 错误

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)

I believe I am not compiling properly and the compiler is not able to find correct headers. 我相信我的编译不正确,并且编译器无法找到正确的头文件。

Compilation : 编译

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

The code : 代码

#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;

}

According to a fast google, you are looking for GtkGLArea , note the uppercase A . 根据一个快速的谷歌,你正在寻找GtkGLArea ,注意大写 A。 – derhass – derhass

you need: 你需要:

sudo apt install *epoxy* and sudo apt install *epoxy*

c++ t.c --target=arm-linux-gnu  `pkg-config --libs --cflags  gtk+-3.0 epoxy ` -o op

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM