二十四、Gtk4-GtkExpression

这篇文章详细介绍了GTK+中的GtkExpression,包括常量表达式、属性表达式和闭包表达式,以及它们的使用方法和示例代码。GtkExpression用于描述对值的引用,通过求值来获取值,常用于GTK+对象属性的动态绑定和计算。

GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。

它类似于算术计算。

1 + 2 = 3

1+2是一个表达式。给出了计算的方法。3是来自表达式的值。求值是计算表达式并得到值。

GtkExpression是一种获取值的方法。Evaluation类似于计算。值是通过计算表达式得到的。

Constant expression

常量表达式(GtkConstantExpression)在求值时提供常量值或实例。

  GValue value = G_VALUE_INIT;
  expression = gtk_constant_expression_new (G_TYPE_INT,100);
  gtk_expression_evaluate (expression, NULL, &value);
  • GtkExpression使用GValue来保存一个值。GValue是一个保存类型和值的结构体和容器。它必须首先用G_VALUE_INIT初始化。注意,value是结构体,而不是指向结构体的指针。
  • 常量表达式用gtk_constant_expression_new函数创建。函数的参数是一个类型(GType)和一个值(或实例)。这个表达式保存一个常量值。G_TYPE_INT是注册到类型系统的类型。整数类型。下表列出了一些类型。
  • gtk_expression_evaluate计算表达式的值。它有三个参数:要求值的表达式、这个实例和一个指向GValue的指针。对于常量表达式来说,这个实例不是必需的。因此,第二个参数是NULL。如果成功计算表达式,gtk_expression_evaluate返回TRUE。否则返回FALSE。
  • 如果返回TRUE,则用表达式的值设置GValue的值。值的类型是int。

请添加图片描述
src/expression目录下有一个示例程序exp_constant_simple.c。

  • 9 .创建常量表达式。它保存一个int值100。变量表达式指向表达式。
  • 11-14:对表达式求值。如果成功,将值显示给stdout。否则显示错误消息。
  • 15-16:释放表达式并取消设置GValue。

常量表达式通常用于将常量值或实例赋给另一个表达式。

Property expression

属性表达式(GtkPropertyExpression)在GObject实例中查找属性。例如,引用GtkLabel对象中的“label”属性的属性表达式是这样创建的。

expression = gtk_property_expression_new (GTK_TYPE_LABEL, another_expression, "label");

第二个形参another_expression是:

  • 在求值时给出GtkLabel实例的表达式。
  • NULL.当给定NULL时,求值时会给出一个GtkLabel实例。这个实例被称为这个对象。

例如,

label = gtk_label_new ("Hello");
another_expression = gtk_constant_expression_new (GTK_TYPE_LABEL, label);
expression = gtk_property_expression_new (GTK_TYPE_LABEL, another_expression, "label");

如果expression被求值,第二个参数another_expression会被提前求值。another_expression的值是标签(GtkLabel实例)。然后,expression查找标签的"label"属性和求值结果"Hello"。

在上面的例子中,gtk_property_expression_new的第二个参数是另一个表达式。但是第二个参数可以是NULL。如果为NULL,则使用这个实例。这由gtk_expression_evaluate函数给出。

在src/expression目录下有一个简单的程序exp_property_simple.c。

 1 #include <gtk/gtk.h>
 2 
 3 int
 4 main (int argc, char **argv) {
   
   
 5   GtkWidget *label;
 6   GtkExpression *expression;
 7   GValue value = G_VALUE_INIT;
 8 
 9   gtk_init ();
10   label = gtk_label_new ("Hello world.");
11   /* Create an expression */
12   expression = gtk_property_expression_new (GTK_TYPE_LABEL, NULL, "label");
13   /* Evaluate the expression */
14   if (gtk_expression_evaluate (expression, label, &value))
15     g_print ("The value is %s.\n", g_value_get_string (&value));
16   else
17     g_print ("The constant expression wasn't evaluated correctly.\n");
18   gtk_expression_unref (expression);
19   g_value_unset (&value);
20 
21   return 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值