0

我正在创建一个派生按钮类。我正在尝试在它的_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;
}

// ===================================================================
4

0 回答 0