类
GtkExpression
描述 [src]
abstract class Gtk.Expression : GObject.TypeInstance
{
/* No available fields */
}
GtkExpression
提供了描述对值的引用的方法。
表达式的重点在于值可以从几步之外的源中获取。例如,一个表达式可能描述“属性 A 的值,该属性来自于 object1
,而后者本身又是 object2
属性的值”。并且在创建表达式时甚至可以不存在 object1
。这与 GObject
属性绑定相反,后者只能在两个对象之间创建直接连接,并且这两个对象在绑定期间都必须存在。
需要“计算”表达式才能获得它当前引用的值。计算始终在当前对象(称为 this
)的上下文中执行(它反映了面向对象语言的行为),该对象可能会影响计算结果,也可能不会。使用 gtk_expression_evaluate()
计算表达式。
存在各种定义表达式的办法,从简单的常量(使用 gtk_constant_expression_new()
),到通过 gtk_property_expression_new()
在 GObject
中查找属性(甚至递归查找属性),再到提供自定义函数以变换和组合表达式(使用 gtk_closure_expression_new()
)。
以下是一个复杂表达式的示例
color_expr = gtk_property_expression_new (GTK_TYPE_LIST_ITEM,
NULL, "item");
expression = gtk_property_expression_new (GTK_TYPE_COLOR,
color_expr, "name");
当使用 this
作为 GtkListItem
计算后,它将从 GtkListItem
中获取“item”属性,然后从所得对象(假设是 GTK_TYPE_COLOR
类型)中获取“name”属性。
描述它的一个更简洁的方式是
this->item->name
你最有可能在列表模型和使用它们列表小部件的上下文中遇到表达式。例如,GtkDropDown
正在计算 GtkExpression
以从模型中的项目中获取字符串,然后可以使用这些字符串与搜索条目的内容进行匹配。GtkStringFilter
出于类似原因正在使用 GtkExpression
。
默认情况下,表达式不会关注变更,计算只是一个给定时间的当前状态的快照。若要获得关于变更的通知,需要通过 GtkExpressionWatch
来“观察”表达式,当表达式的值可能发生变化时,这将导致回调被调用;gtk_expression_watch()
开始观察表达式,gtk_expression_watch_unwatch()
停止观察。
与 GObject 的 GBinding
机制类似,可以通过使用 gtk_expression_bind()
创建观察项,以自动更新对象的属性。
GtkExpression 在 GObject 属性中
若要将 GtkExpression
作为 GObject
属性使用,必须在使用 gtk_param_spec_expression()
在要定义的 GObject
类中安装 GParamSpec
时使用该 GtkExpression
;例如
obj_props[PROP_EXPRESSION] =
gtk_param_spec_expression ("expression",
"Expression",
"The expression used by the widget",
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
在实现虚拟函数 `GObjectClass.set_property` 和 `GObjectClass.get_property` 时,你必须使用 gtk_value_get_expression()
,从`GValue` 容器中检索存储的 GtkExpression
,以及 gtk_value_set_expression()
,将 GtkExpression
存储到 GValue
中;例如
// in set_property()...
case PROP_EXPRESSION:
foo_widget_set_expression (foo, gtk_value_get_expression (value));
break;
// in get_property()...
case PROP_EXPRESSION:
gtk_value_set_expression (value, foo->expression);
break;
UI 文件中的 GtkExpression
GtkBuilder
支持创建表达式。可以在需要 `GtkExpression` 对象的地方,例如表达式属性的 <property>
标签或将属性绑定到表达式的 <binding name="property">
标签中使用此处的语法。
要创建属性表达式,请使用 <lookup>
元素。它可以有一个 type
属性来指定对象类型,并且有一个 name
属性来指定要查找的属性。<lookup>
的内容可以是指定要使用的对象名称的字符串、指定提供对象的表达式或空的元素以使用 this
对象。
示例
<lookup name='search'>string_filter</lookup>
由于 <lookup>
元素创建了一个表达式,并且其元素内容本身可以是表达式,这意味着 <lookup>
标签还可以嵌套。在处理 GtkListItem
s 时,这是一种常见的习惯用法。请参阅 GtkBuilderListItemFactory
以获取此技术的示例。
要创建常量表达式,请使用 <constant>
元素。如果指定了 type
属性,则该元素内容将被解释为该类型的某个值。否则,将假定其为一个对象。例如
<constant>string_filter</constant>
<constant type='gchararray'>Hello, world</constant>
要创建闭包表达式,请使用 <closure>
元素。function
属性指定用于闭包的函数,而 type
属性指定其返回类型。元素的内容包含参数的表达式。例如
<closure type='gchararray' function='combine_args_somehow'>
<constant type='gchararray'>File size:</constant>
<lookup type='GFile' name='size'>myfile</lookup>
</closure>
要创建属性绑定,请使用 <binding>
元素代替通常使用 <property>
标签的位置。支持 name
和 object
属性。name
属性是必需的,并且与适用的属性名称相关。object
属性是可选的。如果提供了,它将使用指定的对象作为“this”对象,当评估表达式时。
<object class='GtkLabel'>
<binding name='label'>
<lookup name='string'>some_other_object</lookup>
</binding>
</object>