石嘴山网站建设,北京网站建设曝光尚词网,中牟建设局网站,网络公司要求做网站工商网监GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。
它类似于算术计算。 1 2 3 12是一个表达式。给出了计算的方法。3是来自表达式的值。求值是计算表达式并得到值。
GtkExpression是一种…GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。
它类似于算术计算。 1 2 3 12是一个表达式。给出了计算的方法。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.h2 3 int4 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 wasnt evaluated correctly.\n);
18 gtk_expression_unref (expression);
19 g_value_unset (value);
20
21 return 0;
22 }9-10: gtk_init初始化GTK GUI工具包。这通常是不必要的因为GtkApplication默认的启动处理程序会进行初始化。一个GtkLabel实例被创建为Hello world.。12:创建属性表达式。它看起来像一个GtkLabel实例的“label”属性。但在创建时没有给出实例因为第二个参数是NULL。该表达式只知道如何从给定future的GtkLabel实例中获取属性。14-17:函数gtk_expression_evaluate使用this实例标签来计算表达式。结果保存在GValue值中。函数g_value_get_string从GValue中获取一个字符串。但是字符串属于GValue所以不能释放字符串。18-19:释放表达式并取消设置GValue。与此同时GValue中的字符串被释放。
如果gtk_property_expression_new的第二个参数不是NULL那么它就是另一个表达式。该表达式由新创建的属性表达式拥有。所以当表达式无用时你只需释放最后一个表达式。然后释放它拥有的另一个表达式。
Clousure expression
闭包表达式在计算闭包时调用闭包。闭包是回调函数(一个指向函数的指针)的通用表示。有关闭包的信息请参阅GObject API参考——GObject消息系统。在src/expression目录下有一些简单的闭包示例文件closure.c和closure_each.c。
有两种闭包表达式GtkCClosureExpression 和GtkClosureExpression。它们分别对应于GCClosure和GClosure。当你用C语言编程时GtkCClosureExpression和GCClosure是合适的。
闭包表达式是用gtk_closure_expression_new函数创建的。
GtkExpression *
gtk_cclosure_expression_new (GType value_type,GClosureMarshal marshal,guint n_params,GtkExpression **params,GCallback callback_func,gpointer user_data,GClosureNotify user_destroy);value_type是求值时值的类型。marshal就是marshaller。你可以赋值NULL。如果它是NULL那么g_cclosure_marshal_generic()被用作marshaller。它是一个通过libffi实现的通用marshaller函数。n_params是参数的数目。params指出了回调函数中每个参数的表达式。callback_func是一个回调函数。它被给出了这个参数和上面的参数。因此如果n_params为3则函数的参数数量为4。(this和params。见下文)。user_data是用户数据。你可以把它添加到闭包中。它类似于g_signal_connect中的user_data。如果没有必要则赋值NULL。user_destroy是user_data的销毁通知。在不再需要user_data时调用该函数销毁它。如果将NULL赋值给user_data也将NULL赋值给user_destroy。
回调函数的格式如下。 C-type callback (this, param1, param2, …) int
callback (GObject *object, int x, const char *s)3-11:回调函数。这个参数只有一个而且是一个this对象。它是一个GtkLabel其标签被假定为(number)(number)。8-10:从标签中检索两个整数并返回它们的和。此函数没有错误报告。如果要返回错误报告将返回值类型更改为指向gboolean和integer结构的指针。一个表示误差另一个表示求和。gtk_cclosure_expression_new的第一个参数是G_TYPE_POINTER。在src/expression目录下有一个示例程序exp_closure_with_error_report。19: gtk_init初始化GTK。这对于GtkLabel是必要的。20:创建一个“123456”的GtkLabel实例。21:实例具有浮动引用。它变成了一个普通的引用计数。22-23:创建闭包表达式。它的返回值类型是G_TYPE_INT没 有参数或“this”对象。24:将标签作为this对象来计算表达式。25:如果计算成功显示“123456”的和。它是579。27:如果失败显示错误信息。28-30:释放expression和标签。重置该值。
闭包表达式比其他类型的表达式更灵活因为你可以指定自己的回调函数。
GtkExpressionWatch
GtkExpressionWatch是一个结构体而不是对象。它表示一个被监视的gtk表达式。两个函数创建了GtkExpressionWatch结构。
gtk_expression_bind function
这个函数将目标对象的属性绑定到表达式上。如果表达式的值改变了属性会立即反映这个值。
GtkExpressionWatch*
gtk_expression_bind (GtkExpression* self,GObject* target,const char* property,GObject* this_
)这个函数接受表达式的所有权。因此如果你想拥有表达式可以调用gtk_expression_ref()来增加表达式的引用计数。当它没用的时候你应该取消引用。如果你不拥有这个表达式你就不在乎释放这个表达式。
一个exp_bind.c和exp_bind的例子。UI位于src/expression目录中。
它包括一个label和一个scale。如果向右移动滑块scale值会增加标签上的数字也会增加。同样地如果向左移动标签上的数字就会减少。标签通过调整绑定到scale值上。 1 ?xml version1.0 encodingUTF-8?2 interface3 object classGtkApplicationWindow idwin4 property namedefault-width600/property5 child6 object classGtkBox7 property nameorientationGTK_ORIENTATION_VERTICAL/property8 child9 object classGtkLabel idlabel
10 property namelabel10/property
11 /object
12 /child
13 child
14 object classGtkScale
15 property nameadjustment
16 object classGtkAdjustment idadjustment
17 property nameupper20.0/property
18 property namelower0.0/property
19 property namevalue10.0/property
20 property namestep-increment1.0/property
21 property namepage-increment5.0/property
22 property namepage-size0.0/property
23 /object
24 /property
25 property namedigits0/property
26 property namedraw-valuetrue/property
27 property namehas-origintrue/property
28 property nameround-digits0/property
29 /object
30 /child
31 /object
32 /child
33 /object
34 /interfaceui文件描述了以下父子关系。
GtkApplicationWindow (win) -- GtkBox -- GtkLabel (label)- GtkScale定义了4个GtkScale属性。
adjustment。GtkAdjustment提供如下功能。 upper and lower:scle的范围。value:scale的当前值。它反映了scale的当前值。step increment and page increment:当用户按箭头键或页面上/下键时缩放比例分别以 step increment和page increment的方式移动。page-size:当与比例一起使用时page-size为0。 digits:数值中显示的小数位数。draw-value:值是否显示。has-origin:标尺是否有原点。如果它为真则在原点和当前点之间出现橙色条。round-digits:数值发生变化时舍入的位数。例如如果它为0则滑块移动到一个整数点。 1 #include gtk/gtk.h
2
3 GtkExpressionWatch *watch;
4
5 static int
6 f2i (GObject *object, double d) {
7 return (int) d;
8 }
9
10 static int
11 close_request_cb (GtkWindow *win) {
12 gtk_expression_watch_unwatch (watch);
13 return false;
14 }
15
16 static void
17 app_activate (GApplication *application) {
18 GtkApplication *app GTK_APPLICATION (application);
19 gtk_window_present (gtk_application_get_active_window(app));
20 }
21
22 static void
23 app_startup (GApplication *application) {
24 GtkApplication *app GTK_APPLICATION (application);
25 GtkBuilder *build;
26 GtkWidget *win, *label;
27 GtkAdjustment *adjustment;
28 GtkExpression *expression, *params[1];
29
30 /* Builds a window with exp.ui resource */
31 build gtk_builder_new_from_file (exp_bind.ui);
32 win GTK_WIDGET (gtk_builder_get_object (build, win));
33 label GTK_WIDGET (gtk_builder_get_object (build, label));
34 // scale GTK_WIDGET (gtk_builder_get_object (build, scale));
35 adjustment GTK_ADJUSTMENT (gtk_builder_get_object (build, adjustment));
36 gtk_window_set_application (GTK_WINDOW (win), app);
37 g_signal_connect (win, close-request, G_CALLBACK (close_request_cb), NULL);
38 g_object_unref (build);
39
40 /* GtkExpressionWatch */
41 params[0] gtk_property_expression_new (GTK_TYPE_ADJUSTMENT, NULL, value);
42 expression gtk_cclosure_expression_new (G_TYPE_INT, NULL, 1, params, G_CALLBACK (f2i), NULL, NULL);
43 watch gtk_expression_bind (expression, label, label, adjustment); /* watch takes the ownership of the expression. */
44 }
45
46 #define APPLICATION_ID com.github.ToshioCP.exp_watch
47
48 int
49 main (int argc, char **argv) {
50 GtkApplication *app;
51 int stat;
52
53 app gtk_application_new (APPLICATION_ID, G_APPLICATION_DEFAULT_FLAGS);
54
55 g_signal_connect (app, startup, G_CALLBACK (app_startup), NULL);
56 g_signal_connect (app, activate, G_CALLBACK (app_activate), NULL);
57
58 stat g_application_run (G_APPLICATION (app), argc, argv);
59 g_object_unref (app);
60 return stat;
61 }41-42:定义两个表达式。一个是属性表达式另一个是闭包表达式。属性表达式查找调整实例的“value”属性。闭包表达式只是将double转换为整数。43: gtk_expression_bind将GtkLabel实例的label属性绑定到闭包表达式返回的整数上。它创建了一个GtkExpressionWatch结构。绑定在watch生命周期内工作。当窗口被销毁时scale和adjustment也被破坏。watch识别出expression变化的value并试图改变标签的属性。显然这不是正确的行为。在窗户被破坏之前watch应该无人看管。37:将窗口上的“关闭请求”信号连接到处理程序close_request_cb。这个信号在单击关闭按钮时发出。处理程序在窗口关闭前被调用。现在正是让GtkExpressionWatch无人观看的好时机。10-14:“close-request”信号处理程序。Gtk_expression_watch_unwatch (watch)使手表停止观察表达式。它释放表达式并在其中调用gtk_expression_watch_unref (watch)。
如果您想将属性绑定到表达式gtk_expression_bind是最佳选择。你可以用gtk_expression_watch函数来实现但它不太适合。
gtk_expression_watch function
Gtkexpression in ui files
Conversion between GValues