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> 标签还可以嵌套。在处理 GtkListItems 时,这是一种常见的习惯用法。请参阅 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> 标签的位置。支持 nameobject 属性。name 属性是必需的,并且与适用的属性名称相关。object 属性是可选的。如果提供了,它将使用指定的对象作为“this”对象,当评估表达式时。

  <object class='GtkLabel'>
    <binding name='label'>
      <lookup name='string'>some_other_object</lookup>
    </binding>
  </object>

实例方法

gtk_expression_bind

将目标 property 属性绑定到 self

gtk_expression_evaluate

计算给定的表达式并在成功时将结果存储在 value 中。

gtk_expression_get_value_type

获取此表达式计算为值类型的 GType

gtk_expression_is_static

检查表达式是否是静态的。

gtk_expression_ref

获取给定 GtkExpression 的一个引用。

gtk_expression_unref

释放给定 GtkExpression 的一个引用。

gtk_expression_watch

观察给定的 expression 是否有更改。