2014-09-13 124 views
5

你知道如何在GTK 3中创建自定义小部件?我试图在C中继承GtkDrawingArea数小时。 Gnome.org仅提供了关于如何继承G_OBJECT的简洁教程。我的问题是,G_Object/GTK失败GTK_WIDGET铸造时查看我的自定义StrokerNodalContainerGtkWidget一个子类,甚至是艰难的我的定义struct包含这样一行:如何在C中的GTK3中创建自定义小部件?

GtkDrawingArea parent_instance; 

它说:

invalid cast from 'StrokerNodalContainer' to 'GtkWidget' 

这里是完整的代码,如果你怀疑别的东西可能是错的。这是最小的,所以我没有看到任何外部代码搞乱的原因。

司炉-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__ */ 

司炉-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; 
} 

Ť要求任何帮助!

+0

在官方wiki上有一个例子,但它使用的是Vala,而不是C,https://wiki.gnome.org/Projects/Vala/CustomWidgetSamples – user2485710 2014-09-13 15:10:10

+0

是的,但Vala或C++或Java或Python非常简单:类继承特性是语言的核心,所以他们只是使用它。我无法识别我的GObject继承。 – 2014-09-13 16:09:46

+0

Vala编译为C89 + Glib + Gobject,我建议如下:在Vala中编写基本的代码,将Vala编译为C,检查生成的C代码。 – user2485710 2014-09-13 16:13:35

回答

3

错误消息是,可能是因为此:

G_DEFINE_TYPE(StrokerNodalContainer, stroker_nodal_container, G_TYPE_OBJECT) 

如果你看一下documentation for G_DEFINE_TYPE()你会看到第三个参数应该是父类型:您可能希望GTK_TYPE_DRAWING_AREA这里。

+0

就是这样。该教程非常快,并说“父GType”。 – 2014-09-13 22:07:07

相关问题