圖躍網(wǎng)站建設(shè)國(guó)外網(wǎng)站開發(fā)
GtkExpression是一種基本類型。它不是GObject的后代。GtkExpression提供了一種描述對(duì)值的引用的方法。GtkExpression需要求值才能獲得值。
它類似于算術(shù)計(jì)算。
1 + 2 = 3
1+2是一個(gè)表達(dá)式。給出了計(jì)算的方法。3是來(lái)自表達(dá)式的值。求值是計(jì)算表達(dá)式并得到值。
GtkExpression是一種獲取值的方法。Evaluation類似于計(jì)算。值是通過(guò)計(jì)算表達(dá)式得到的。
Constant expression
常量表達(dá)式(GtkConstantExpression)在求值時(shí)提供常量值或?qū)嵗?/p>
GValue value = G_VALUE_INIT;expression = gtk_constant_expression_new (G_TYPE_INT,100);gtk_expression_evaluate (expression, NULL, &value);
- GtkExpression使用GValue來(lái)保存一個(gè)值。GValue是一個(gè)保存類型和值的結(jié)構(gòu)體和容器。它必須首先用G_VALUE_INIT初始化。注意,value是結(jié)構(gòu)體,而不是指向結(jié)構(gòu)體的指針。
- 常量表達(dá)式用gtk_constant_expression_new函數(shù)創(chuàng)建。函數(shù)的參數(shù)是一個(gè)類型(GType)和一個(gè)值(或?qū)嵗?。這個(gè)表達(dá)式保存一個(gè)常量值。G_TYPE_INT是注冊(cè)到類型系統(tǒng)的類型。整數(shù)類型。下表列出了一些類型。
- gtk_expression_evaluate計(jì)算表達(dá)式的值。它有三個(gè)參數(shù):要求值的表達(dá)式、這個(gè)實(shí)例和一個(gè)指向GValue的指針。對(duì)于常量表達(dá)式來(lái)說(shuō),這個(gè)實(shí)例不是必需的。因此,第二個(gè)參數(shù)是NULL。如果成功計(jì)算表達(dá)式,gtk_expression_evaluate返回TRUE。否則返回FALSE。
- 如果返回TRUE,則用表達(dá)式的值設(shè)置GValue的值。值的類型是int。
src/expression目錄下有一個(gè)示例程序exp_constant_simple.c。
- 9 .創(chuàng)建常量表達(dá)式。它保存一個(gè)int值100。變量表達(dá)式指向表達(dá)式。
- 11-14:對(duì)表達(dá)式求值。如果成功,將值顯示給stdout。否則顯示錯(cuò)誤消息。
- 15-16:釋放表達(dá)式并取消設(shè)置GValue。
常量表達(dá)式通常用于將常量值或?qū)嵗x給另一個(gè)表達(dá)式。
Property expression
屬性表達(dá)式(GtkPropertyExpression)在GObject實(shí)例中查找屬性。例如,引用GtkLabel對(duì)象中的“l(fā)abel”屬性的屬性表達(dá)式是這樣創(chuàng)建的。
expression = gtk_property_expression_new (GTK_TYPE_LABEL, another_expression, "label");
第二個(gè)形參another_expression是:
- 在求值時(shí)給出GtkLabel實(shí)例的表達(dá)式。
- NULL.當(dāng)給定NULL時(shí),求值時(shí)會(huì)給出一個(gè)GtkLabel實(shí)例。這個(gè)實(shí)例被稱為這個(gè)對(duì)象。
例如,
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被求值,第二個(gè)參數(shù)another_expression會(huì)被提前求值。another_expression的值是標(biāo)簽(GtkLabel實(shí)例)。然后,expression查找標(biāo)簽的"label"屬性和求值結(jié)果"Hello"。
在上面的例子中,gtk_property_expression_new的第二個(gè)參數(shù)是另一個(gè)表達(dá)式。但是第二個(gè)參數(shù)可以是NULL。如果為NULL,則使用這個(gè)實(shí)例。這由gtk_expression_evaluate函數(shù)給出。
在src/expression目錄下有一個(gè)簡(jiǎn)單的程序exp_property_simple.c。
1 #include <gtk/gtk.h>2 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 wasn't evaluated correctly.\n");
18 gtk_expression_unref (expression);
19 g_value_unset (&value);
20
21 return 0;
22 }
- 9-10: gtk_init初始化GTK GUI工具包。這通常是不必要的,因?yàn)镚tkApplication默認(rèn)的啟動(dòng)處理程序會(huì)進(jìn)行初始化。一個(gè)GtkLabel實(shí)例被創(chuàng)建為"Hello world."。
- 12:創(chuàng)建屬性表達(dá)式。它看起來(lái)像一個(gè)GtkLabel實(shí)例的“l(fā)abel”屬性。但在創(chuàng)建時(shí),沒(méi)有給出實(shí)例,因?yàn)榈诙€(gè)參數(shù)是NULL。該表達(dá)式只知道如何從給定future的GtkLabel實(shí)例中獲取屬性。
- 14-17:函數(shù)gtk_expression_evaluate使用this實(shí)例標(biāo)簽來(lái)計(jì)算表達(dá)式。結(jié)果保存在GValue值中。函數(shù)g_value_get_string從GValue中獲取一個(gè)字符串。但是字符串屬于GValue,所以不能釋放字符串。
- 18-19:釋放表達(dá)式并取消設(shè)置GValue。與此同時(shí),GValue中的字符串被釋放。
如果gtk_property_expression_new的第二個(gè)參數(shù)不是NULL,那么它就是另一個(gè)表達(dá)式。該表達(dá)式由新創(chuàng)建的屬性表達(dá)式擁有。所以,當(dāng)表達(dá)式無(wú)用時(shí),你只需釋放最后一個(gè)表達(dá)式。然后釋放它擁有的另一個(gè)表達(dá)式。
Clousure expression
閉包表達(dá)式在計(jì)算閉包時(shí)調(diào)用閉包。閉包是回調(diào)函數(shù)(一個(gè)指向函數(shù)的指針)的通用表示。有關(guān)閉包的信息,請(qǐng)參閱GObject API參考——GObject消息系統(tǒng)。在src/expression目錄下有一些簡(jiǎn)單的閉包示例文件closure.c和closure_each.c。
有兩種閉包表達(dá)式,GtkCClosureExpression 和GtkClosureExpression。它們分別對(duì)應(yīng)于GCClosure和GClosure。當(dāng)你用C語(yǔ)言編程時(shí),GtkCClosureExpression和GCClosure是合適的。
閉包表達(dá)式是用gtk_closure_expression_new函數(shù)創(chuàng)建的。
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是求值時(shí)值的類型。
- marshal就是marshaller。你可以賦值NULL。如果它是NULL,那么g_cclosure_marshal_generic()被用作marshaller。它是一個(gè)通過(guò)libffi實(shí)現(xiàn)的通用marshaller函數(shù)。
- n_params是參數(shù)的數(shù)目。
- params指出了回調(diào)函數(shù)中每個(gè)參數(shù)的表達(dá)式。
- callback_func是一個(gè)回調(diào)函數(shù)。它被給出了這個(gè)參數(shù)和上面的參數(shù)。因此,如果n_params為3,則函數(shù)的參數(shù)數(shù)量為4。(this和params。見(jiàn)下文)。
- user_data是用戶數(shù)據(jù)。你可以把它添加到閉包中。它類似于g_signal_connect中的user_data。如果沒(méi)有必要,則賦值NULL。
- user_destroy是user_data的銷毀通知。在不再需要user_data時(shí),調(diào)用該函數(shù)銷毀它。如果將NULL賦值給user_data,也將NULL賦值給user_destroy。
回調(diào)函數(shù)的格式如下。
C-type
callback (this, param1, param2, …)
int
callback (GObject *object, int x, const char *s)
- 3-11:回調(diào)函數(shù)。這個(gè)參數(shù)只有一個(gè),而且是一個(gè)
this
對(duì)象。它是一個(gè)GtkLabel,其標(biāo)簽被假定為"(number)+(number)"。 - 8-10:從標(biāo)簽中檢索兩個(gè)整數(shù),并返回它們的和。此函數(shù)沒(méi)有錯(cuò)誤報(bào)告。如果要返回錯(cuò)誤報(bào)告,將返回值類型更改為指向gboolean和integer結(jié)構(gòu)的指針。一個(gè)表示誤差,另一個(gè)表示求和。gtk_cclosure_expression_new的第一個(gè)參數(shù)是G_TYPE_POINTER。在src/expression目錄下有一個(gè)示例程序exp_closure_with_error_report。
- 19: gtk_init初始化GTK。這對(duì)于GtkLabel是必要的。
- 20:創(chuàng)建一個(gè)“123+456”的GtkLabel實(shí)例。
- 21:實(shí)例具有浮動(dòng)引用。它變成了一個(gè)普通的引用計(jì)數(shù)。
- 22-23:創(chuàng)建閉包表達(dá)式。它的返回值類型是G_TYPE_INT,沒(méi) 有參數(shù)或“this”對(duì)象。
- 24:將標(biāo)簽作為
this
對(duì)象來(lái)計(jì)算表達(dá)式。 - 25:如果計(jì)算成功,顯示“123+456”的和。它是579。
- 27:如果失敗,顯示錯(cuò)誤信息。
- 28-30:釋放expression和標(biāo)簽。重置該值。
閉包表達(dá)式比其他類型的表達(dá)式更靈活,因?yàn)槟憧梢灾付ㄗ约旱幕卣{(diào)函數(shù)。
GtkExpressionWatch
GtkExpressionWatch是一個(gè)結(jié)構(gòu)體,而不是對(duì)象。它表示一個(gè)被監(jiān)視的gtk表達(dá)式。兩個(gè)函數(shù)創(chuàng)建了GtkExpressionWatch結(jié)構(gòu)。
gtk_expression_bind function
這個(gè)函數(shù)將目標(biāo)對(duì)象的屬性綁定到表達(dá)式上。如果表達(dá)式的值改變了,屬性會(huì)立即反映這個(gè)值。
GtkExpressionWatch*
gtk_expression_bind (GtkExpression* self,GObject* target,const char* property,GObject* this_
)
這個(gè)函數(shù)接受表達(dá)式的所有權(quán)。因此,如果你想擁有表達(dá)式,可以調(diào)用gtk_expression_ref()來(lái)增加表達(dá)式的引用計(jì)數(shù)。當(dāng)它沒(méi)用的時(shí)候,你應(yīng)該取消引用。如果你不擁有這個(gè)表達(dá)式,你就不在乎釋放這個(gè)表達(dá)式。
一個(gè)exp_bind.c和exp_bind的例子。UI位于src/expression目錄中。
它包括一個(gè)label和一個(gè)scale。如果向右移動(dòng)滑塊,scale值會(huì)增加,標(biāo)簽上的數(shù)字也會(huì)增加。同樣地,如果向左移動(dòng),標(biāo)簽上的數(shù)字就會(huì)減少。標(biāo)簽通過(guò)調(diào)整綁定到scale值上。
1 <?xml version='1.0' encoding='UTF-8'?>2 <interface>3 <object class='GtkApplicationWindow' id='win'>4 <property name='default-width'>600</property>5 <child>6 <object class='GtkBox'>7 <property name='orientation'>GTK_ORIENTATION_VERTICAL</property>8 <child>9 <object class='GtkLabel' id='label'>
10 <property name="label">10</property>
11 </object>
12 </child>
13 <child>
14 <object class='GtkScale'>
15 <property name='adjustment'>
16 <object class='GtkAdjustment' id='adjustment'>
17 <property name='upper'>20.0</property>
18 <property name='lower'>0.0</property>
19 <property name='value'>10.0</property>
20 <property name='step-increment'>1.0</property>
21 <property name='page-increment'>5.0</property>
22 <property name='page-size'>0.0</property>
23 </object>
24 </property>
25 <property name='digits'>0</property>
26 <property name='draw-value'>true</property>
27 <property name='has-origin'>true</property>
28 <property name='round-digits'>0</property>
29 </object>
30 </child>
31 </object>
32 </child>
33 </object>
34 </interface>
ui文件描述了以下父子關(guān)系。
GtkApplicationWindow (win) -- GtkBox -+- GtkLabel (label)+- GtkScale
定義了4個(gè)GtkScale屬性。
- adjustment。GtkAdjustment提供如下功能。
- upper and lower:scle的范圍。
- value:scale的當(dāng)前值。它反映了scale的當(dāng)前值。
- step increment and page increment:當(dāng)用戶按箭頭鍵或頁(yè)面上/下鍵時(shí),縮放比例分別以 step increment和page increment的方式移動(dòng)。
- page-size:當(dāng)與比例一起使用時(shí),page-size為0。
- digits:數(shù)值中顯示的小數(shù)位數(shù)。
- draw-value:值是否顯示。
- has-origin:標(biāo)尺是否有原點(diǎn)。如果它為真,則在原點(diǎn)和當(dāng)前點(diǎn)之間出現(xiàn)橙色條。
- round-digits:數(shù)值發(fā)生變化時(shí)舍入的位數(shù)。例如,如果它為0,則滑塊移動(dòng)到一個(gè)整數(shù)點(diǎn)。
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:定義兩個(gè)表達(dá)式。一個(gè)是屬性表達(dá)式,另一個(gè)是閉包表達(dá)式。屬性表達(dá)式查找調(diào)整實(shí)例的“value”屬性。閉包表達(dá)式只是將double轉(zhuǎn)換為整數(shù)。
- 43: gtk_expression_bind將GtkLabel實(shí)例的label屬性綁定到閉包表達(dá)式返回的整數(shù)上。它創(chuàng)建了一個(gè)GtkExpressionWatch結(jié)構(gòu)。綁定在watch生命周期內(nèi)工作。當(dāng)窗口被銷毀時(shí),scale和adjustment也被破壞。watch識(shí)別出expression變化的value,并試圖改變標(biāo)簽的屬性。顯然,這不是正確的行為。在窗戶被破壞之前,watch應(yīng)該無(wú)人看管。
- 37:將窗口上的“關(guān)閉請(qǐng)求”信號(hào)連接到處理程序close_request_cb。這個(gè)信號(hào)在單擊關(guān)閉按鈕時(shí)發(fā)出。處理程序在窗口關(guān)閉前被調(diào)用?,F(xiàn)在正是讓GtkExpressionWatch無(wú)人觀看的好時(shí)機(jī)。
- 10-14:“close-request”信號(hào)處理程序。Gtk_expression_watch_unwatch (watch)使手表停止觀察表達(dá)式。它釋放表達(dá)式并在其中調(diào)用gtk_expression_watch_unref (watch)。
如果您想將屬性綁定到表達(dá)式,gtk_expression_bind是最佳選擇。你可以用gtk_expression_watch函數(shù)來(lái)實(shí)現(xiàn),但它不太適合。