2014-09-13 20 views
5

sai come si crea un widget personalizzato in GTK 3? Ho provato a sottoclasse GtkDrawingArea in C per ore. Gnome.org fornisce solo un breve tutorial su come sottoclasse G_OBJECT. Il mio problema è che G_Object/GTK non riesce a vedere il mio personalizzato StrokerNodalContainer come una sottoclasse di GtkWidget durante il lancio con GTK_WIDGET, anche dura la mia definizione struct contiene una linea come questa:Come creare un widget personalizzato in GTK3 in C?

GtkDrawingArea parent_instance; 

Dice:

invalid cast from 'StrokerNodalContainer' to 'GtkWidget' 

Ecco il codice completo se si sospetta che qualcos'altro potrebbe essere sbagliato. È minimo quindi non vedo alcun motivo per cui il codice esterno si rovini.

stroker-nodalcontainer.h

#ifndef __STROKER_NODALCONTAINER_H__ 
#define __STROKER_NODALCONTAINER_H__ 

#ifndef NO_INCLUDE_WITHIN_HEADERS 
#include <gtk/gtk.h> 
#endif 

#define STROKER_TYPE_NODAL_CONTAINER     (stroker_nodal_container_get_type()) 
#define STROKER_NODAL_CONTAINER(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), STROKER_TYPE_NODAL_CONTAINER, StrokerNodalContainer)) 
#define STROKER_NODAL_CONTAINER_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), STROKER_TYPE_NODAL_CONTAINER, StrokerNodalContainerClass)) 
#define STROKER_IS_NODAL_CONTAINER(obj)    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STROKER_TYPE_NODAL_CONTAINER)) 
#define STROKER_IS_NODAL_CONTAINER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), STROKER_TYPE_NODAL_CONTAINER)) 
#define STROKER_NODAL_CONTAINER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), STROKER_TYPE_NODAL_CONTAINER, StrokerNodalContainerClass)) 

typedef struct _StrokerNodalContainer  StrokerNodalContainer; 
typedef struct _StrokerNodalContainerClass StrokerNodalContainerClass; 

struct _StrokerNodalContainer 
{ 
    GtkDrawingArea parent_instance; 
}; 

struct _StrokerNodalContainerClass 
{ 
    GtkDrawingAreaClass parent_class; 
}; 

GType stroker_nodal_container_get_type(void); 

//StrokerNodalContainer* stroker_nodalcontainer_new(void); 

#endif /* __STROKER_NODALCONTAINER_H__ */ 

stroker-nodalcontainer.c

#include <gtk/gtk.h> 
#include "stroker-nodalcontainer.h" 

G_DEFINE_TYPE(StrokerNodalContainer, stroker_nodal_container, G_TYPE_OBJECT) 

static void stroker_nodal_container_class_init(StrokerNodalContainerClass* klass) 
    {} 

static void stroker_nodal_container_init(StrokerNodalContainer* self) 
{ 
    GdkRGBA c; 
    GtkWidget *widget; 

    gdk_rgba_parse(&c, "blue"); 
    widget = GTK_WIDGET(self); 

    gtk_widget_override_background_color(widget, GTK_STATE_FLAG_NORMAL, &c); 
} 

main.ce

#include <stdlib.h> 
#include <stdio.h> 
#include <gtk/gtk.h> 
#include <cairo/cairo.h> 

#include "stroker-nodalcontainer.h" 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *nodalWidget; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW (window), "Stroker"); 
    g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL); 
    gtk_container_set_border_width(GTK_CONTAINER(window), 10); 
    gtk_widget_show (window); 

    nodalWidget = g_object_new(STROKER_TYPE_NODAL_CONTAINER,NULL); 
    gtk_container_add(GTK_CONTAINER(window), nodalWidget); 
    gtk_widget_show (nodalWidget); 

    gtk_main(); 


    return EXIT_SUCCESS; 
} 

T ti affido per qualsiasi aiuto!

+0

c'è un esempio sul wiki ufficiale ma sta usando Vala, non C, https://wiki.gnome.org/Projects/Vala/CustomWidgetSamples – user2485710

+0

Sì, ma Vala o C++ o java o python sono così facili: il la caratteristica dell'ereditarietà di classe è all'interno del nucleo del linguaggio, quindi lo usano. Non riesco a riconoscere l'ereditarietà di 'GObject'. –

+0

Vala compila fino a C89 + Glib + Gobject, suggerisco quanto segue: codice qualcosa di base in Vala, compilare Vala a C, ispezionare il codice C generato. – user2485710

risposta

3

messaggio L'errore è probabilmente a causa di questo:

G_DEFINE_TYPE(StrokerNodalContainer, stroker_nodal_container, G_TYPE_OBJECT) 

Se si guarda al documentation for G_DEFINE_TYPE() vedrete il terzo argomento dovrebbe essere il tipo di genitore: probabilmente vuole GTK_TYPE_DRAWING_AREA qui.

+0

E 'stato. Il tutorial è stato abbastanza veloce e ha detto "genitore GType". –

Problemi correlati