我正在创建一个派生按钮类。我正在尝试在它的_init
方法中设置按钮的默认标签。但是,它似乎在方法结束时被覆盖。它只有在我在_new
方法中应用它时才有效。
编辑:这个类的意图:有一个带有默认标签的 GtkButton 类。
代码摘录
static void
xbutton_init ( Xbutton* self )
{
// init variables
gtk_button_set_label(GTK_BUTTON(self), "Xbutton"); // APPARENTLY OVERWRITTEN AFTER THIS FUNCTION
}
// =======================
GtkWidget*
xbutton_new ()
{
GtkWidget * w = g_object_new (xbutton_get_type(), NULL);
gtk_button_set_label(GTK_BUTTON(w), "Xbutton"); // WORKS
return w;
}
完整来源
标题
#ifndef __XBUTTON_H__
#define __XBUTTON_H__
#include <gtk/gtk.h>
G_BEGIN_DECLS
#ifndef CLASS_DEF
#define CLASS_DEF(_classname) typedef struct _##_classname _classname; \
struct _##_classname
#endif
// ------------------------------------
// ---- Define class (meta class) -----
// ----- (e.g. functions/signals) -----
// ------------------------------------
CLASS_DEF(XbuttonClass)
{
GtkButtonClass parent_class;
};
// --------------------------------------------------
// ---- Instance related things (e.g. variables) ----
// --------------------------------------------------
CLASS_DEF(Xbutton)
{
GtkButton parent;
};
// ------------------------------------------------
// --------------------------
// ---- Public functions ----
// --------------------------
#define XBUTTON_TYPE (xbutton_get_type ())
#define XBUTTON(obj) GTK_CHECK_CAST (obj, xbutton_get_type (), Xbutton)
#define IS_XBUTTON(obj) GTK_CHECK_TYPE (obj, xbutton_get_type ())
#define XBUTTON_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, xbutton_get_type (), Xbutton)
GType xbutton_get_type (void);
GtkWidget* xbutton_new (void);
G_END_DECLS
#endif /* include-protector */
c文件
#include "xbutton.h"
// -------------------------------------------------------------------
G_DEFINE_TYPE(Xbutton, xbutton, GTK_TYPE_BUTTON);
// -------------------------------------------------------------------
static gboolean
on_click_callback (GtkWidget *button,
GdkEventButton *event)
{
printf("button was clicked\n");
// don't forget the call to parent
return GTK_WIDGET_CLASS(xbutton_parent_class)->button_press_event(button,event);
}
// ===================================================================
// @brief: init class stuff like methods
static void xbutton_class_init( XbuttonClass* klass )
{
// override class methods from GtkButton:
GtkButtonClass * parent_button = GTK_BUTTON_CLASS(klass);
// override class methods from GtkWidget:
GtkWidgetClass * parent_widget = GTK_WIDGET_CLASS(klass);
parent_widget->button_press_event = on_click_callback;
}
// ===================================================================
static void xbutton_init( Xbutton* self )
{
// init variables
gtk_button_set_label(GTK_BUTTON(self), "Xbutton"); // APPARENTLY OVERWRITTEN AFTER THIS FUNCTION
}
// ===================================================================
GtkWidget*
xbutton_new ()
{
GtkWidget * w = g_object_new (xbutton_get_type(), NULL);
gtk_button_set_label(GTK_BUTTON(w), "Xbutton"); // WORKS
return w;
}
// ===================================================================