2014-09-13 9 views
5

Wissen Sie, wie Sie ein benutzerdefiniertes Widget in GTK 3 erstellen? Ich habe versucht, GtkDrawingArea in C stundenlang zu untergliedern. Gnome.org bietet nur ein kurzes Tutorial, wie man G_OBJECT ableiten kann. Mein Problem ist, dass G_Object/GTK nicht meinen benutzerdefinierten StrokerNodalContainer als Unterklasse von GtkWidget zu sehen, wenn sie mit GTK_WIDGET Gießen, auch hart meine Definition struct enthält eine Zeile wie diese:Wie erstellt man benutzerdefinierte Widget in GTK3 in C?

GtkDrawingArea parent_instance; 

Dort heißt es:

invalid cast from 'StrokerNodalContainer' to 'GtkWidget' 

Hier ist der vollständige Code, wenn Sie vermuten, dass etwas anderes falsch ist. Es ist minimal, daher sehe ich keinen Grund für externen Code, der durcheinander gebracht werden könnte.

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.c

#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 Hank du für jede Hilfe!

+0

Es gibt ein Beispiel im offiziellen Wiki, aber es verwendet Vala, nicht C, https://wiki.gnome.org/Projects/Vala/CustomWidgetSamples – user2485710

+0

Ja, aber Vala oder C++ oder Java oder Python sind so einfach: die Klassenvererbung ist im Kern der Sprache, also benutzen sie das einfach. Ich kann meine GObject-Erbschaft nicht erkennen. –

+0

Vala kompiliert bis C89 + Glib + Gobject, ich schlage folgendes vor: Code etwas Grundlegendes in Vala, kompiliere Vala zu C, inspiziere den generierten C-Code. – user2485710

Antwort

3

Die Fehlermeldung ist wahrscheinlich aus diesem Grund:

G_DEFINE_TYPE(StrokerNodalContainer, stroker_nodal_container, G_TYPE_OBJECT) 

Wenn Sie die documentation for G_DEFINE_TYPE() sehen Sie das dritte Argument sollte die übergeordnete Typ sehen werden sein: Sie wahrscheinlich GTK_TYPE_DRAWING_AREA hier wollen.

+0

Das war es. Das Tutorial war ziemlich schnell und sagte "der Eltern-GType". –

Verwandte Themen