接口
GtkEditable
描述 [src]
interface Gtk.Editable : Gtk.Widget
GtkEditable
是用于编辑文本的控件的接口 。
可编辑控件的典型示例是 GtkEntry
和 GtkSpinButton
。它包含用于一般操作可编辑控件的函数、大量用于键绑定的操作信号以及应用程序可以连接来修改控件行为的几个信号。
作为一个后一种用法示例,通过将以下处理程序连接到 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-text
和 GtkEditable::delete-text
信号将从“包装器”可编辑传播到代理,但它们不会从代理传播到“包装器”可编辑,因为这会造成无限递归。如果您希望连接到 GtkEditable::insert-text
和 GtkEditable::delete-text
信号,您需要通过 gtk_editable_get_delegate()
获得的代理对其进行连接。
先决条件
为了实现可编辑,您的类型必须继承自GtkWidget
。
接口结构
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 |
|
无可用说明。 |
|
insert_text |
|
无可用说明。 |
|
delete_text |
|
无可用说明。 |
|
changed |
|
无可用说明。 |
|
get_text |
|
无可用说明。 |
|
do_insert_text |
|
无可用说明。 |
|
do_delete_text |
|
无可用说明。 |
|
get_selection_bounds |
|
无可用说明。 |
|
set_selection_bounds |
|
无可用说明。 |
|
get_delegate |
|
无可用说明。 |