您知道如何在GTK 3中创建自定义窗口小部件吗?我试图用C继承GtkDrawingArea几个小时。Gnome.org仅提供有关如何继承G_OBJECT的简要教程。我的问题是G_Object
/GTK
无法在将with强制转换时将我的自定义StrokerNodalContainer
视为子类,即使我的定义很难包含这样的行:GtkWidget
GTK_WIDGET
struct
GtkDrawingArea parent_instance;
它说 :
invalid cast from 'StrokerNodalContainer' to 'GtkWidget'
如果您怀疑还有其他问题,请参见以下完整代码。它很小,所以我看不到任何外部代码混乱的原因。
笔者节点容器
#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__ */
笔者节点容器
#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;
}
感谢您的任何帮助 !
该错误消息可能是由于以下原因:
G_DEFINE_TYPE( StrokerNodalContainer, stroker_nodal_container, G_TYPE_OBJECT )
如果查看G_DEFINE_TYPE()的文档,您会看到第三个参数应该是父类型:您可能需要GTK_TYPE_DRAWING_AREA
在此处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句