GLib
  • Initial page
  • I. Концепция
    • Background
    • Типы данных и программирование
  • Динамическая система типов Glib
    • Введение
    • Функции копирования
    • Соглашения
    • Неинстанциируемые не классифицированные базовые типы
    • Инстанциируемые классифицируемые типы: объекты
    • Неинстанциированные классифицированные типы: Интерфейсы.
  • Основной класс GObject
    • Введение
    • Инстанциация объекта
    • Объектное управление памятью
    • Свойства объекта
  • Система сообщений GObject
    • Замыкания
    • Сигналы
  • II. Описание API
    • GType
    • GTypePlugin
    • GTypeModule
    • GObject часть 1
    • GObject часть 2
    • Enums and Flags
    • GBoxed
    • Generic Values
    • Parameters and Values часть 1
    • Parameters and Values часть 2
    • Parameters and Values часть 3, ага
    • Value arrays
  • III. Описание инструментов
    • glib-mkenums
    • glib-genmarshal
    • gobject-query
  • IV. Руководство
    • Как определить и реализовать новый GObject?
    • Объектные методы
    • Как определять и реализовывать Интерфейсы?
    • Как создавать и использовать сигналы
    • Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)
  • V. Об инструментах
    • Об инструментах
  • GTK 4
    • GtkApplication и GtkApplicationWindow
    • Widgets
Powered by GitBook
On this page
  • Краткое описание
  • Иерархия объектов
  • Сигналы
  • Описание
  • Детали

Was this helpful?

  1. II. Описание API

GObject часть 1

GObject — Базовый тип объекта

Краткое описание


#include <glib-object.h>


                    GObject;
                    GObjectClass;
                    GObjectConstructParam;
void                (*GObjectGetPropertyFunc)           (GObject *object,
                                                         guint property_id,
                                                         GValue *value,
                                                         GParamSpec *pspec);
void                (*GObjectSetPropertyFunc)           (GObject *object,
                                                         guint property_id,
                                                         const GValue *value,
                                                         GParamSpec *pspec);
void                (*GObjectFinalizeFunc)              (GObject *object);
#define             G_TYPE_IS_OBJECT                    (type)
#define             G_OBJECT                            (object)
#define             G_IS_OBJECT                         (object)
#define             G_OBJECT_CLASS                      (class)
#define             G_IS_OBJECT_CLASS                   (class)
#define             G_OBJECT_GET_CLASS                  (object)
#define             G_OBJECT_TYPE                       (object)
#define             G_OBJECT_TYPE_NAME                  (object)
#define             G_OBJECT_CLASS_TYPE                 (class)
#define             G_OBJECT_CLASS_NAME                 (class)
void                g_object_class_install_property     (GObjectClass *oclass,
                                                         guint property_id,
                                                         GParamSpec *pspec);
GParamSpec*         g_object_class_find_property        (GObjectClass *oclass,
                                                         const gchar *property_name);
GParamSpec**        g_object_class_list_properties      (GObjectClass *oclass,
                                                         guint *n_properties);
void                g_object_class_override_property    (GObjectClass *oclass,
                                                         guint property_id,
                                                         const gchar *name);
void                g_object_interface_install_property (gpointer g_iface,
                                                         GParamSpec *pspec);
GParamSpec*         g_object_interface_find_property    (gpointer g_iface,
                                                         const gchar *property_name);
GParamSpec**        g_object_interface_list_properties  (gpointer g_iface,
                                                         guint *n_properties_p);
gpointer            g_object_new                        (GType object_type,
                                                         const gchar *first_property_name,
                                                         ...);
gpointer            g_object_newv                       (GType object_type,
                                                         guint n_parameters,
                                                         GParameter *parameters);
                    GParameter;
gpointer            g_object_ref                        (gpointer object);
void                g_object_unref                      (gpointer object);
gpointer            g_object_ref_sink                   (gpointer object);
typedef             GInitiallyUnowned;
typedef             GInitiallyUnownedClass;
#define             G_TYPE_INITIALLY_UNOWNED
gboolean            g_object_is_floating                (gpointer object);
void                g_object_force_floating             (GObject *object);
void                (*GWeakNotify)                      (gpointer data,
                                                         GObject *where_the_object_was);
void                g_object_weak_ref                   (GObject *object,
                                                         GWeakNotify notify,
                                                         gpointer data);
void                g_object_weak_unref                 (GObject *object,
                                                         GWeakNotify notify,
                                                         gpointer data);
void                g_object_add_weak_pointer           (GObject *object,
                                                         gpointer *weak_pointer_location);
void                g_object_remove_weak_pointer        (GObject *object,
                                                         gpointer *weak_pointer_location);
void                (*GToggleNotify)                    (gpointer data,
                                                         GObject *object,
                                                         gboolean is_last_ref);
void                g_object_add_toggle_ref             (GObject *object,
                                                         GToggleNotify notify,
                                                         gpointer data);
void                g_object_remove_toggle_ref          (GObject *object,
                                                         GToggleNotify notify,
                                                         gpointer data);
gpointer            g_object_connect                    (gpointer object,
                                                         const gchar *signal_spec,
                                                         ...);
void                g_object_disconnect                 (gpointer object,
                                                         const gchar *signal_spec,
                                                         ...);
void                g_object_set                        (gpointer object,
                                                         const gchar *first_property_name,
                                                         ...);
void                g_object_get                        (gpointer object,
                                                         const gchar *first_property_name,
                                                         ...);
void                g_object_notify                     (GObject *object,
                                                         const gchar *property_name);
void                g_object_freeze_notify              (GObject *object);
void                g_object_thaw_notify                (GObject *object);
gpointer            g_object_get_data                   (GObject *object,
                                                         const gchar *key);
void                g_object_set_data                   (GObject *object,
                                                         const gchar *key,
                                                         gpointer data);
void                g_object_set_data_full              (GObject *object,
                                                         const gchar *key,
                                                         gpointer data,
                                                         GDestroyNotify destroy);
gpointer            g_object_steal_data                 (GObject *object,
                                                         const gchar *key);
gpointer            g_object_get_qdata                  (GObject *object,
                                                         GQuark quark);
void                g_object_set_qdata                  (GObject *object,
                                                         GQuark quark,
                                                         gpointer data);
void                g_object_set_qdata_full             (GObject *object,
                                                         GQuark quark,
                                                         gpointer data,
                                                         GDestroyNotify destroy);
gpointer            g_object_steal_qdata                (GObject *object,
                                                         GQuark quark);
void                g_object_set_property               (GObject *object,
                                                         const gchar *property_name,
                                                         const GValue *value);
void                g_object_get_property               (GObject *object,
                                                         const gchar *property_name,
                                                         GValue *value);
GObject*            g_object_new_valist                 (GType object_type,
                                                         const gchar *first_property_name,
                                                         va_list var_args);
void                g_object_set_valist                 (GObject *object,
                                                         const gchar *first_property_name,
                                                         va_list var_args);
void                g_object_get_valist                 (GObject *object,
                                                         const gchar *first_property_name,
                                                         va_list var_args);
void                g_object_watch_closure              (GObject *object,
                                                         GClosure *closure);
void                g_object_run_dispose                (GObject *object);
#define             G_OBJECT_WARN_INVALID_PROPERTY_ID   (object, property_id, pspec)

Иерархия объектов


  GObject
   +----GTypeModule

Сигналы


  "notify"                                         : Run First / No Recursion / Has Details / Action / No Hooks

Описание

Пример 1.

  container = create_container();
  container_add_child (container, create_child());

Пример 2.

  Child *child;
  container = create_container();
  child = create_child();
  container_add_child (container, child);
  g_object_unref (child);

Некоторые реализации объекта могут нуждаться в сохранении плавающего состояния объекта в определённых частях кода (например GtkMenu), для этого может использоваться следующее:

Пример 3.

  /* сохраняем плавающее состояние */
  gboolean was_floating = g_object_is_floating (object);
  g_object_ref_sink (object);
  /* скрытая часть кода */
  ...;
  /* восстановление плавающего состояния */
  if (was_floating)
    g_object_force_floating (object);
  g_obejct_unref (object); /* освобождение предварительно полученной ссылки */

Детали

GObject

typedef struct _GObject GObject;

GObjectClass

typedef struct {
  GTypeClass   g_type_class;

  /* seldomly overidden */
  GObject*   (*constructor)     (GType                  type,
                                 guint                  n_construct_properties,
                                 GObjectConstructParam *construct_properties);
  /* overridable methods */
  void       (*set_property)		(GObject        *object,
                                         guint           property_id,
                                         const GValue   *value,
                                         GParamSpec     *pspec);
  void       (*get_property)		(GObject        *object,
                                         guint           property_id,
                                         GValue         *value,
                                         GParamSpec     *pspec);
  void       (*dispose)			(GObject        *object);
  void       (*finalize)		(GObject        *object);
  /* seldomly overidden */
  void       (*dispatch_properties_changed) (GObject      *object,
					     guint	   n_pspecs,
					     GParamSpec  **pspecs);
  /* signals */
  void	     (*notify)			(GObject	*object,
					 GParamSpec	*pspec);

  /* called when done constructing */
  void	     (*constructed)		(GObject	*object);
} GObjectClass;

Структура класса для типа GObject.

Пример 4. Реализация единицы множества используя конструктор

static MySingleton *the_singleton = NULL;

static GObject*
my_singleton_constructor (GType                  type,
                          guint                  n_construct_params,
                          GObjectConstructParam *construct_params)
{
  GObject *object;
  
  if (!the_singleton)
    {
      object = G_OBJECT_CLASS (parent_class)->constructor (type,
                                                           n_construct_params,
                                                           construct_params);
      the_singleton = MY_SINGLETON (object);
    }
  else
    object = g_object_ref (G_OBJECT (the_singleton));

  return object;
}

родительский класс

constructor ()

set_property ()

основной установщик для всех свойств этого типа. Должен быть переназначен для каждого типа со свойствами. Реализация set_property не должна явно издавать уведомление об изменении свойства, это обрабатывается системой типов.

get_property ()

основной получатель для всех свойств этого типа. Должен быть переназначен для каждого типа со свойствами.

dispose ()

функция dispose сбрасывает все ссылки на другие объекты, но сохраняет экземпляр нетронутым, так чтобы вызванный метод клиента остался роботающим. Это может быть выполнено множество раз (due to reference loops). Перед возвратом, dispose должна привязаться к dispose методу родительского класса.

finalize ()

функция инициализации экземпляра, должна завершать финализацию экземпляра начатую в dispose и привязаться к методу finalize родительского класса.

dispatch_properties_changed ()

издаёт уведомление изменения свойства для связки свойств. Переназначение dispatch_properties_changed должно быть редко необходимо.

notify ()

классовое замыкание для уведомляющего сигнала

constructed ()

GObjectConstructParam

typedef struct {
  GParamSpec *pspec;
  GValue     *value;
} GObjectConstructParam;

Значение для параметра конструктора

GObjectGetPropertyFunc ()

void                (*GObjectGetPropertyFunc)           (GObject *object,
                                                         guint property_id,
                                                         GValue *value,
                                                         GParamSpec *pspec);

object :

property_id :

value :

pspec :

GObjectSetPropertyFunc ()

void                (*GObjectSetPropertyFunc)           (GObject *object,
                                                         guint property_id,
                                                         const GValue *value,
                                                         GParamSpec *pspec);

object :

property_id :

value :

новое значение свойства

pspec :

GObjectFinalizeFunc ()

void                (*GObjectFinalizeFunc)              (GObject *object);

object :

G_TYPE_IS_OBJECT()

#define G_TYPE_IS_OBJECT(type)      (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)

type :

Возвращает :

G_OBJECT()

#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))

object :

Объект который необходимо преобразовать.

G_IS_OBJECT()

#define G_IS_OBJECT(object)         (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))

object :

G_OBJECT_CLASS()

#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))

class :

G_IS_OBJECT_CLASS()

#define G_IS_OBJECT_CLASS(class)    (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))

class :

G_OBJECT_GET_CLASS()

#define G_OBJECT_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))

object :

G_OBJECT_TYPE()

#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))

Возвращает типовой id объекта.

object :

Объект для которого возвращается типовой id.

Возвращает :

Типовой id для object.

G_OBJECT_TYPE_NAME()

#define G_OBJECT_TYPE_NAME(object)  (g_type_name (G_OBJECT_TYPE (object)))

Возвращает имя объектного типа.

object :

Объект для которого возвращается типовое имя.

Возвращает :

Типовое имя object. Строкой владеет система типов и её не нужно освобождать.

G_OBJECT_CLASS_TYPE()

#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))

Возвращает типовой id сструктуры класса.

class :

Возвращает :

Типовой id для class.

G_OBJECT_CLASS_NAME()

#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))

Возвращает имя классовой сструктуры типа.

class :

Возвращает :

Типовое имя class. Строкой владеет система типов и она не должна освобождаться.

g_object_class_install_property ()

void                g_object_class_install_property     (GObjectClass *oclass,
                                                         guint property_id,
                                                         GParamSpec *pspec);

Устанавливает новое свойство. Это обычно делается в инициализации класса.

oclass :

property_id :

id для нового свойства

pspec :

g_object_class_find_property ()

GParamSpec*         g_object_class_find_property        (GObjectClass *oclass,
                                                         const gchar *property_name);

oclass :

property_name :

искомое имя свойства

Возвращает :

g_object_class_list_properties ()

GParamSpec**        g_object_class_list_properties      (GObjectClass *oclass,
                                                         guint *n_properties);

oclass :

n_properties :

расположение длины возвращаемого массива

Возвращает :

g_object_class_override_property ()

void                g_object_class_override_property    (GObjectClass *oclass,
                                                         guint property_id,
                                                         const gchar *name);

Регистрирует property_id как ссылку свойства с именем name в родительском классе или в интерфейсе реализуемом с помощью oclass. Это позволяет классу переназначатьсвойство реализации в родительском классе или обеспечить реализацию свойства из интерфейса.

Помните

oclass :

property_id :

новый ID свойства

name :

имя свойства зарегистрированное в родительском классе или в интерфейсе этого класса.

Начиная с версии 2.4

g_object_interface_install_property ()

void                g_object_interface_install_property (gpointer g_iface,
                                                         GParamSpec *pspec);

g_iface :

любой vtable для интерфейса, или значение по умолчанию vtable для интерфейса.

pspec :

Начиная с версии 2.4

g_object_interface_find_property ()

GParamSpec*         g_object_interface_find_property    (gpointer g_iface,
                                                         const gchar *property_name);

g_iface :

любой интерфейсный vtable для интерфейса, или значение по умолчанию vtable для интерфейса

property_name :

имя искомого свойства

Возвращает :

Начиная с версии 2.4

g_object_interface_list_properties ()

GParamSpec**        g_object_interface_list_properties  (gpointer g_iface,
                                                         guint *n_properties_p);

g_iface :

любой интерфейсный vtable для интерфейса, или значение по умолчанию vtable для интерфейса

n_properties_p :

расположение для хранения количества возвращённых свойств.

Возвращает :

Начиная с версии 2.4

PreviousGTypeModuleNextGObject часть 2

Last updated 4 years ago

Was this helpful?

GObject является базовым типом обеспечивающим основные атрибуты и методы для всех объектных типов в GTK+, Pango и других библиотеках основанных на GObject. Класс GObject обеспечивает методы для конструирования и уничтожения объектов, методы доступа к свойству и поддержку сигналов. Сигналы подробно описаны в (3).

наследует . Единственное различие между ними заключается в том что начальная ссылка помечается как плавающая ссылка. Это значит что ни какой частью кода ни кто не "владеет". Основная мотивация обеспечения плавающих ссылок - удобство C. В частности, это позволяет писать код как:

Если container_add_child() выполнит для помещённого child, ссылка на вновь созданный child не будет плавающей. Без плавающей ссылки, container_add_child() может создать ссылку на новый child только с помощью , поэтому реализовать этот код без плавающей ссылки нужно было бы так:

Плавающие ссылки могут быть преобразованы в обычные ссылки вызовом . Для объектов которые уже не имеют плавающих ссылок, эквивалентна и возвращает новую ссылку. Так как плавающие ссылки в основном полезны только для удобства C, языковые привязки которые обеспечивают автоматизированные ссылки и монопольно обслуживают память (вроде умных указателей или "сборщики мусора") поэтому не нуждаются во вставке плавающих ссылок в их API.

Все поля в структуре GObject являются закрытыми для реализации и не должны использоваться непосредственно.

g_type_class;

функция constructor вызывается с помощью для завершения инициализации объекта после установки всех свойств конструирования. Первое что должна сделать функция constructor - реализовать цепочку к constructor родительского класса. Отмена constructor редко необходима, например для обработки свойств конструирования, или для реализации единицы подмножества (singletons).

функция constructed вызывается с помощью как завершающий шаг процесса создания объекта. В точке вызова, все свойства конструкции уже установлены на объект. Цель этого вызова позволить учесть шаги инициализации объекта которые выполняются только после установки свойств конструкции. Реализованные constructed должны привязываться к вызову constructed их родительского класса что позволяет завершить их инициализацию.

Вспомогательная структура GObjectConstructParam используется для расположения / пар в constructor принадлежащем .

*pspec;

параметр конструктора

*value;

Тип функции get_property в .

a

числовой id под которым было зарегистрировано свойство с помощью .

возвращаемого значения свойства

описание свойства

Тип функции set_property в .

числовой id под которым было зарегистрировано свойство с помощью .

описание свойства

Тип функции finalize в .

финализируемый

Возвращает логическое значение или указывающее соответствует ли помещённый типовой id или происходит из него.

Типовой id для проверки отношения к .

или , указывая соответствует ли type объекту .

Приводит или полученный указатель к указателю (GObject*). В зависимости от текущего уровня отладки, эта функция может вызвать определённые динамические проверки чтобы идентифицировать недопустимые приведения типов.

Проверяет допустимость указателя типа .

Экземпляр для проверки соответствия типу .

Приводит полученную структуру к структуре .

допустимая

Проверяет является ли class "is a" допустимой структурой типа или производной.

Возвращает классовую структуру связанную с экземпляром .

экземпляр .

допустимая

допустимая

для нового свойства

Находит для свойства класса.

для свойства, или если класс не имеет свойства с таким именем

Возвращает массив * для всех свойств класса.

массив * который должен быть освобождён после использования

Внутренне, переназначение реализуется созданием свойства типа ; обычно операции которые запрашивают свойства объектного класса, такие как или вернут переназначенное свойство. Однако, в одном случае, construct_propertiesпараметр виртуальной функции constructor, помещается вместо , так чтобы поле param_id было заполнено правильным . Для виртуального использования это не имеет разницы. Если вам нужно получить переназначенное свойство, вы можете вызвать .

Добавляет свойство к интерфейсу; это полезно только для интерфейсов которые добавлены в GObject-производные типы. Добавление свойства в интерфейс заставляет все объекты класса иметь совместимые свойства с этим интерфейсом. Совместимые свойства могут быть вновь созданным , но обычно используется так чтобы объектный класс обеспечил реализацию и унаследовал описание свойства, значение по умолчанию, связь, и так далее из своего интерфейса.

Эта функция предназначается для вызова из значения по умолчанию vtable интерфейсной функции инициализации (член class_init в .) Это нельзя вызвать после того как class_init вызвана для любой реализации объектных типов этого интерфейса.

для нового свойства

Находит с полученным именем для интерфейса. В основном, интерфейсный vtable помещённый как g_iface будет значением по умолчанию vtable из , или, если известно что интерфейс уже загружен, .

для свойства интерфейса с именем property_name, или если нет такого свойства.

Списки свойств интерфейса. В основном, интерфейсный vtable помещаемый как g_iface будет значением по умолчанию vtable из , или, если известно что интерфейс уже загружен, .

указатель на массив указателей структур . Структурами владеет GLib, но массив должен быть освобождён с помощью когда он вам больше не нужен.

Сигналы
GInitiallyUnowned
GObject
GInitiallyUnowned
g_object_ref_sink()
g_object_ref()
g_object_ref_sink()
g_object_ref_sink()
g_object_ref()
GObject
GParamSpec
GValue
GObjectClass
GObjectClass
GObjectClass
GObjectClass
FALSE
TRUE
G_TYPE_OBJECT
GObject
GTypeInstance
G_TYPE_OBJECT
GObjectClass
GObjectClass
GObjectClass
G_TYPE_OBJECT
GObject
GParamSpec
GParamSpec
GParamSpecOverride
g_object_class_find_property()
g_object_class_list_properties()
GParamSpecOverride
GParamSpec
g_param_spec_get_redirect_target()
GParamSpec
g_object_class_override_property()
GTypeInfo
GParamSpec
g_type_default_interface_ref()
g_type_default_interface_peek()
g_type_default_interface_ref()
g_type_default_interface_peek()
GTypeClass
g_object_new()
g_object_new()
GParamSpec
GParamSpec
GValue
GObject
g_object_class_install_property()
GValue
GParamSpec
GObject
g_object_class_install_property()
GParamSpec
GObject
G_TYPE_OBJECT
FALSE
TRUE
G_TYPE_OBJECT
G_TYPE_OBJECT
GObjectClass
GObjectClass
GObject
GObjectClass
GObjectClass
GObjectClass
GParamSpec
GObjectClass
GParamSpec
NULL
GObjectClass
GParamSpec
GObjectClass
GParamSpec
GParamSpec
NULL
GParamSpec
g_free()