二十四、Gtk4-GtkExpression
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 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工具包。这通常是不必要的,因为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:创建一个“123+456”的GtkLabel实例。
- 21:实例具有浮动引用。它变成了一个普通的引用计数。
- 22-23:创建闭包表达式。它的返回值类型是G_TYPE_INT,没 有参数或“this”对象。
- 24:将标签作为
this
对象来计算表达式。 - 25:如果计算成功,显示“123+456”的和。它是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 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文件描述了以下父子关系。
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
相关文章:

二十四、Gtk4-GtkExpression
GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。 它类似于算术计算。 1 2 3 12是一个表达式。给出了计算的方法。3是来自表达式的值。求值是计算表达式并得到值。 GtkExpression是一种…...

Oracle Dataguard(主库为 Oracle rac 集群)配置教程(02)—— Oracle RAC 主库的相关操作
Oracle Dataguard(主库为 Oracle rac 集群)配置教程(02)—— Oracle RAC 主库的相关操作 / 本专栏详细讲解 Oracle Dataguard(Oracle 版本为11g,主库为双节点 Oracle rac 集群)的配置过程。主要…...

midjournery AI绘画使用指南
midjournery AI绘画使用指南 基于Discord的Midjournery配置: https://www.bilibili.com/video/BV16d4y1A7Zq/?spm_id_from333.337.search-card.all.click&vd_source9c3ca9555620bed64bdee27ae49d37cf 使用原则 使用midjournery绘画的原则是给出对脑海中某个…...

iptables防火墙SNAT和DNAT
iptables防火墙SNAT和DNAT一、SNAT原理和应用1、SNAT原理2、SNAT应用环境3、SNAT转换前提条件二、SNAT案列1、实验需求2、实验环境3、实验目的三、DNAT原理和应用1、DNAT原理2、DNAT 应用环境3、DNAT转换的前提条件四、DNAT案列总结一、SNAT原理和应用 1、SNAT原理 SNAT原理:…...

python | 第二章考试题和练习题
一、考试题 1、turtle八边形绘制 问题描述: 使用turtle库,绘制一个八边形。 参考代码: import turtle as t t.pensize(2) for i in range(8):t.fd(100)t.left(45) 2、turtle八角图形绘制 问题描述: 使用turtle库,…...
Mysql 存储引擎设计:xa协议相关接口功能及实现
需要对接的接口以及每个接口的实现 recovery 阶段 此阶段由 xa.cc 文件中的 xarecover_handlerton() 函数完成,它通过三个接口实现与存储引擎的沟通:recover(),commit_by_xid() ,rollback_by_xid()。其流程如下: 此…...

字符串常量池
1.创建对象的思考下面两种创建字符串的方式一样吗?public static void main(String[] args) {//两者一样吗String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System…...
让技术更有温度,腾讯Light 点亮公益之光
蓝天白云,远处是广东最长跨海大桥——南澳大桥,一艘小船在海面驶过,近处一头中华白海豚露出水面。在第三届腾讯Light技术公益创造营上,海南智渔可持续发展研究中心科学总监郑锐强为我们展现这样一幅人与自然和平相处的美好画面。随…...

电子采购一体化解决方案
企事业数字化转型专家,提供各类应用解决方案。您身边的赋能小助手! 文章目录前言一、当下采购的痛点二、解决方案-供应商管理1.供应商管理三、解决方案-企业询价、供应商报价管理四、解决方案-采购订单五、送货、到货、订单管理总结前言 随着各类产业链…...

SAP COPA 获利能力分析深度解析
一、获利分析配置及相关值概述 二、配置:组织结构 2.1 定义经营范围-KEP8 2.2 维护经营关注点-KEA0 2.3 获利能力分析类型解析 2.4 控制范围分配给经营范围-KEKK 三、配置:数据结构-KEA0 3.1 特征字段 3.1.1 特征字段类别 3.1.2 维护特征字段-K…...

Java学习记录day6
书接上回 类与对象 static关键字 static的作用: 修饰一个属性:声明为static的变量实质上就是一个全局变量,其生命周期为从类被加载开始一直到程序结束;修饰方法:无须本类的对象也可以调用该方法;修饰一个类&#x…...

ubuntu 使用 adb 工具卸载鸿蒙系统预装软件
准备工作 打开 USB 调试 进入 “设置->关于手机” 连续点击版本号, 直到有提示开启了"开发人员选项" 进入 “设置->系统和更新->开发人员选项”, 打开 USB 调式, 顺便可以把"自动系统更新"关了 下载 adb 工具 官方地址: https://developer.an…...

Jmeter in Linux - 在Linux系统使用Jmeter的坑
Jmeter in Linux - 在Linux系统使用Jmeter的坑Jmeter in Linux系列目录:o.a.j.JMeter: Error in NonGUIDriver起因错误分析:解决方案:解析日志没有展示请求和响应信息起因解决方案:注意Jmeter in Linux系列目录: 【如…...

什么是特权访问管理(PAM)
特权访问管理 (PAM) 是指一组 IT 安全管理原则,可帮助企业隔离和管理特权访问、管理特权帐户和凭据、控制谁可以获得对哪些端点的管理访问权限级别,并监视用户对该访问权限执行的操作。 什么是特权访问 特权访问是一种 IT 系统访…...

LeetCode题目笔记——1.两数之和
文章目录题目描述题目难度——简单方法一:暴力代码/Python方法二:哈希表代码/Python代码/C总结题目描述 这道题可以说是力扣的入坑题了,很经典,好像还是面试的经典题。 给定一个整数数组 nums 和一个整数目标值 target,…...
CSDN版的详细MarkDown的使用教程
MarkDown的使用欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释…...

Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器
windows电脑在网页端输入“http://192.168.xxx.xxx:8080/login”访问远程ubuntu18.04服务器,访问其docker镜像的Nextcloud,提示“”Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器“”,如下图…...

Set集合的特点,HashSet去重的几个重要问题
Set集合的特点:无下标,无序(新增顺序和遍历顺序不一致,新增顺序不影响遍历顺序,而且有一个固定顺序),去重(不允许重复记录)public class TestOne {public static void main(String[] args) {// Set集合的特点ÿ…...

云计算|OpenStack|社区版OpenStack安装部署文档(十一--- 如何获取镜像---Rocky版)
前言: 前面我们使用虚拟机搭建了一个openstack集群,也就是在VM虚拟机的基础上模拟了一个简单的基于openstack社区版Rocky的私有云,但,不管任何部署安装工作,最后其实都是需要有实际的应用的,也就是常说的实…...
UmiJS学习
UmiJS4学习笔记起步官网学习:https://umijs.org/开发环境Umi.js 需要使用 Node.js来进行开发,因此请先确保电脑已经安装了 Node.js 且版本在 14 以上。安装pnpm:npm install pnpm -g创建项目Umi 官方提供了一个脚手架 ,可以轻松快…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...