как встроить сюжет в gtk и glade - PullRequest
6 голосов
/ 14 июля 2020

Я пытаюсь создать простой gui, используя glade и gtk в C. В GUI я хочу добавить виджет, который отображает данные (линейный график и гистограмма - это все, что мне нужно) (постоянно обновляется), и я не знаю, что использовать. Я видел, что gnuplot популярен, но понятия не имею, как его использовать в приложении. Мне нужны предложения и инструкции, потому что я не могу их найти.

вот пример кода, который я использую в качестве основы, просто чтобы дать вам представление

update: I построил gnuplot на моем p c, и теперь, когда я запускаю код, он не открывает новое окно и, кажется, строит график внутри моего окна. единственная проблема в том, что виджет в моем контейнере gtkbox не меняет размер, поэтому он выглядит как крошечная белая полоса. Я предполагаю, что он работает, потому что я удалил

gui.graph = gnuplot_init() ;
    gnuplot_setstyle(gui.graph, "lines") ;
    gnuplot_cmd(gui.graph, "set terminal x11 window \"%x\"", (int)gtk_socket_get_id (gui.socket));
    gnuplot_plot_slope(gui.graph, 1.0, 0.0, "unity slope") ;

и запустил команды на отдельном терминале, и всплывает упомянутая мною белая полоса.

#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include "variables.h"
#include "gnuplot_i.h"

struct test tv;
struct GUI gui;

// Functions
void GUISetup();

int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);
    gui.builder = gtk_builder_new_from_file("glade/window_main.glade");

    gui.window = GTK_WIDGET(gtk_builder_get_object(gui.builder, "window_main"));
    gtk_builder_connect_signals(gui.builder, NULL);
    
    GUISetup();
    
    g_object_unref(gui.builder);
    // start fullbuilderscreen
    gtk_window_fullscreen(GTK_WINDOW(gui.window));
    gtk_widget_show(gui.window);                
    gtk_main();

    return 0;
}

void GUISetup(){
    gui.socket = gtk_socket_new ();
    gtk_container_add (GTK_CONTAINER (gui.MainContainer), gui.socket);
    //gtk_widget_show (gui.socket);
    //gtk_widget_realize (gui.socket);
    
    gui.graph = gnuplot_init() ;
    gnuplot_setstyle(gui.graph, "lines") ;
    gnuplot_cmd(gui.graph, "set terminal x11 window \"%x\"", (int)gtk_socket_get_id (gui.socket));
    gnuplot_plot_slope(gui.graph, 1.0, 0.0, "unity slope") ;
}

когда я делаю, я получаю это:

gcc -c -g -O0 -Wall -pthread -pipe src/main.c `pkg-config --cflags --libs gtk+-3.0` -o main.o 
src/main.c: In function ‘GUISetup’:
src/main.c:66:86: warning: passing argument 1 of ‘gtk_socket_get_id’ from incompatible pointer type [-Wincompatible-pointer-types]
 ui.graph, "set terminal x11 window \"%x\"", (int)gtk_socket_get_id (gui.socket));
                                                                     ^~~
In file included from /usr/include/gtk-3.0/gtk/gtkx.h:29:0,
                 from src/main.c:25:
/usr/include/gtk-3.0/gtk/gtksocket.h:81:12: note: expected ‘GtkSocket * {aka struct _GtkSocket *}’ but argument is of type ‘GtkWidget * {aka struct _GtkWidget *}’
 Window     gtk_socket_get_id          (GtkSocket *socket_);
            ^~~~~~~~~~~~~~~~~
gcc -o interface main.o gnuplot_i.o -pthread `pkg-config --cflags --libs gtk+-3.0` -export-dynamic

Я протестировал код вручную и получил те же результаты, что и здесь , поэтому я собираюсь попробовать собрать gnuplot и изменить файлы конфигурации. Есть ли альтернатива решению, найденному в этом посте?

1 Ответ

3 голосов
/ 14 июля 2020

Для gnuplot:

http://ndevilla.free.fr/gnuplot/gnuplot_i/index.html

Или вы можете использовать Gtk :: Socket, начните с создания Gtk::Socket и добавьте его в свой виджет. Затем передайте идентификатор сокета (шестнадцатеричный) в gnuplot 'set terminal x11 window "ID". И все!

Matplot может быть лучше:

https://github.com/lava/matplotlib-cpp

...