接口

GtkEditable

描述 [src]

interface Gtk.Editable : Gtk.Widget

GtkEditable 是用于编辑文本的控件的接口 。

可编辑控件的典型示例是 GtkEntryGtkSpinButton。它包含用于一般操作可编辑控件的函数、大量用于键绑定的操作信号以及应用程序可以连接来修改控件行为的几个信号。

作为一个后一种用法示例,通过将以下处理程序连接到 GtkEditable::insert-text,应用程序可以将控件中的所有输入转换成 大写。

强制输入为大写。

#include <ctype.h>

void
insert_text_handler (GtkEditable *editable,
                     const char  *text,
                     int          length,
                     int         *position,
                     gpointer     data)
{
  char *result = g_utf8_strup (text, length);

  g_signal_handlers_block_by_func (editable,
                               (gpointer) insert_text_handler, data);
  gtk_editable_insert_text (editable, result, length, position);
  g_signal_handlers_unblock_by_func (editable,
                                     (gpointer) insert_text_handler, data);

  g_signal_stop_emission_by_name (editable, "insert_text");

  g_free (result);
}

实现 GtkEditable

在自己的控件上实现 GtkEditable 最有可能的情况是,您将在复杂控件内部嵌入一个 GtkText,并希望将可编辑功能委托给该文本控件。GtkEditable 提供一些实用函数,用以轻松地 操作。

在您的 class_init 函数中,调用 gtk_editable_install_properties(),传递第一个可用的属性 ID

static void
my_class_init (MyClass *class)
{
  ...
  g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
  gtk_editable_install_properties (object_clas, NUM_PROPERTIES);
  ...
}

在您的 GtkEditable 接口的 interface_init 函数中,为 get_delegate vfunc 提供实现,返回您的文本小组件

GtkEditable *
get_editable_delegate (GtkEditable *editable)
{
  return GTK_EDITABLE (MY_WIDGET (editable)->text_widget);
}

static void
my_editable_init (GtkEditableInterface *iface)
{
  iface->get_delegate = get_editable_delegate;
}

您不需要提供其他 vfunc。默认实现通过转发到 GtkEditableInterface.get_delegate() vfunc 返回的代理来工作。

在您的 instance_init 函数中,创建您的文本小组件,然后调用 gtk_editable_init_delegate()

static void
my_widget_init (MyWidget *self)
{
  ...
  self->text_widget = gtk_text_new ();
  gtk_editable_init_delegate (GTK_EDITABLE (self));
  ...
}

在您的 dispose 函数中,在销毁您的文本小组件前调用 gtk_editable_finish_delegate()

static void
my_widget_dispose (GObject *object)
{
  ...
  gtk_editable_finish_delegate (GTK_EDITABLE (self));
  g_clear_pointer (&self->text_widget, gtk_widget_unparent);
  ...
}

最后,在您的 set_property 函数中使用 gtk_editable_delegate_set_property()(并类似地用在 get_property 中),以设置可编辑属性

  ...
  if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
    return;

  switch (prop_id)
  ...

值得注意的是,如果您创建了一个使用代理的 GtkEditable,则较低级别的 GtkEditable::insert-textGtkEditable::delete-text 信号将从“包装器”可编辑传播到代理,但它们不会从代理传播到“包装器”可编辑,因为这会造成无限递归。如果您希望连接到 GtkEditable::insert-textGtkEditable::delete-text 信号,您需要通过 gtk_editable_get_delegate() 获得的代理对其进行连接。

先决条件

为了实现可编辑,您的类型必须继承自GtkWidget

功能

gtk_editable_delegate_get_property

获取 objectGtkEditable 代理的属性。

gtk_editable_delegate_set_property

设置 objectGtkEditable 代理的属性。

gtk_editable_install_properties

class 覆盖 GtkEditable 属性。

实例方法

gtk_editable_delegate_get_accessible_platform_state

从可编辑代理检索可访问平台状态。

since: 4.10

gtk_editable_delete_selection

删除可编辑内容当前选定的文本。

gtk_editable_delete_text

删除一段字符。

gtk_editable_finish_delegate

撤消 gtk_editable_init_delegate() 所做的设置。

gtk_editable_get_alignment

获取可编辑内容的对齐方式。

gtk_editable_get_chars

检索一段字符。

gtk_editable_get_delegate

获取 editable 正在用其实现委托其实现的 GtkEditable

gtk_editable_get_editable

检索 editable 是否可编辑。

gtk_editable_get_enable_undo

获取 editable 的撤消/重做操作是否已启用。

gtk_editable_get_max_width_chars

在字符中检索 editable 的所需最大宽度。

gtk_editable_get_position

检索游标当前相对于可编辑内容开头的位置。

gtk_editable_get_selection_bounds

检索可编辑内容的选择边界。

gtk_editable_get_text

检索 editable 的内容。

gtk_editable_get_width_chars

获取为可编辑内容保留的字符数。

gtk_editable_init_delegate

设置 GtkEditable 的代理。

gtk_editable_insert_text

length 字节的 text 插入小组件内容的 position 位置。

gtk_editable_select_region

选择文本区域。

gtk_editable_set_alignment

设置可编辑区域内容的对齐方式。

gtk_editable_set_editable

确定用户能否编辑可编辑控件中的文本。

gtk_editable_set_enable_undo

如果启用,对 editable 的更改将被保存以供撤消/重做操作。

gtk_editable_set_max_width_chars

设置 editable 以字符为单位所需的最大的宽度。

gtk_editable_set_position

将可编辑文本中的光标位置设置为给定值。

gtk_editable_set_text

将可编辑文本中的文本设置为给定的值。

gtk_editable_set_width_chars

更改可编辑部件的大小请求,使其成为适合 n_chars 字符的合适大小。

属性

Gtk.Editable:cursor-position

插入光标的当前位置(以字符表示)。

Gtk.Editable:editable

条目内容是否可以编辑。

Gtk.Editable:enable-undo

是否为可编辑部件启用撤消/重做功能。

Gtk.Editable:max-width-chars

条目所需的最大的宽度(以字符表示)。

Gtk.Editable:selection-bound

选择区域中与光标相对一端的点的位置(以字符表示)。

Gtk.Editable:text

条目的内容。

Gtk.Editable:width-chars

在条目中留出多少字符的空间。

Gtk.Editable:xalign

水平对齐方式,从 0(左)到 1(右)。

信号

Gtk.Editable::changed

在对内容进行单个用户可见的操作时发出。

Gtk.Editable::delete-text

当用户在控件中删除文本时发出。

Gtk.Editable::insert-text

当用户在控件中插入文本时发出。

接口结构

struct GtkEditableInterface {
  GTypeInterface base_iface;
  void (* insert_text) (
    GtkEditable* editable,
    const char* text,
    int length,
    int* position
  );
  void (* delete_text) (
    GtkEditable* editable,
    int start_pos,
    int end_pos
  );
  void (* changed) (
    GtkEditable* editable
  );
  const char* (* get_text) (
    GtkEditable* editable
  );
  void (* do_insert_text) (
    GtkEditable* editable,
    const char* text,
    int length,
    int* position
  );
  void (* do_delete_text) (
    GtkEditable* editable,
    int start_pos,
    int end_pos
  );
  gboolean (* get_selection_bounds) (
    GtkEditable* editable,
    int* start_pos,
    int* end_pos
  );
  void (* set_selection_bounds) (
    GtkEditable* editable,
    int start_pos,
    int end_pos
  );
  GtkEditable* (* get_delegate) (
    GtkEditable* editable
  );
  
}

无可用说明。

接口成员
base_iface
GTypeInterface
 

无可用说明。

insert_text
void (* insert_text) (
    GtkEditable* editable,
    const char* text,
    int length,
    int* position
  )
 

无可用说明。

delete_text
void (* delete_text) (
    GtkEditable* editable,
    int start_pos,
    int end_pos
  )
 

无可用说明。

changed
void (* changed) (
    GtkEditable* editable
  )
 

无可用说明。

get_text
const char* (* get_text) (
    GtkEditable* editable
  )
 

无可用说明。

do_insert_text
void (* do_insert_text) (
    GtkEditable* editable,
    const char* text,
    int length,
    int* position
  )
 

无可用说明。

do_delete_text
void (* do_delete_text) (
    GtkEditable* editable,
    int start_pos,
    int end_pos
  )
 

无可用说明。

get_selection_bounds
gboolean (* get_selection_bounds) (
    GtkEditable* editable,
    int* start_pos,
    int* end_pos
  )
 

无可用说明。

set_selection_bounds
void (* set_selection_bounds) (
    GtkEditable* editable,
    int start_pos,
    int end_pos
  )
 

无可用说明。

get_delegate
GtkEditable* (* get_delegate) (
    GtkEditable* editable
  )
 

无可用说明。

虚拟方法

Gtk.Editable.changed
无可用说明。

Gtk.Editable.delete_text

删除一段字符。

Gtk.Editable.do_delete_text

删除一段字符。

Gtk.Editable.do_insert_text

length 字节的 text 插入小组件内容的 position 位置。

Gtk.Editable.get_delegate

获取 editable 正在用其实现委托其实现的 GtkEditable

Gtk.Editable.get_selection_bounds

检索可编辑内容的选择边界。

Gtk.Editable.get_text

检索 editable 的内容。

Gtk.Editable.insert_text

length 字节的 text 插入小组件内容的 position 位置。

Gtk.Editable.set_selection_bounds

选择文本区域。