十二、Gtk4-信号

十、Gtk4-Build system 到目前为止,我们已经编译了一个小型编辑器。但一些不好的迹象已经开始出现。这些思想对于管理大型源文件很有用。 阅读详情

1 信号

每个对象都封装在Gtk程序中。而且不推荐使用全局变量,因为它们容易使程序变得复杂。因此,我们需要一些东西来在对象之间通信。有两种方法可以做到这一点。

  • 函数。例如,tb = gtk_text_view_get_buffer (tv)。调用者请求tv提供tb,这是一个连接到tv的GtkTextBuffer实例。
  • 信号。例如,在GApplication对象上的activate信号。当应用程序被启动时,就会发出信号。这时,连接到该信号的处理程序会被调用。

函数的调用者或连接到信号的处理程序通常位于对象之外。这两者之间的区别之一是对象是主动的或被动的。在函数中,对象被动地响应调用者。对象主动向处理程序发送信号。

GObject信号被注册、连接和发射。

  1. 信号注册到发出信号的对象类型。注册通常在对象类初始化时完成。
  2. 信号通过g_connect_signal或其族函数连接到处理程序。连接通常是在对象之外完成的。
  3. 在发射信号时,调用连接的处理程序。信号在对象的实例上发出。

2 信号注册

在TfeTextView中,注册了两个信号。

  • “change-file”信号。当tv->file发生改变时,发出此信号。
  • “open-response”信号。tfe_text_view_open函数不能返回状态,因为它使用了GtkFileChooserDialog。发出这个信号而不是函数的返回值。

一个静态变量或数组用于存储信号ID。

enum {
  CHANGE_FILE,
  OPEN_RESPONSE,
  NUMBER_OF_SIGNALS
};

static guint tfe_text_view_signals[NUMBER_OF_SIGNALS];

信号注册在类初始化函数中。

 1 static void
 2 tfe_text_view_class_init (TfeTextViewClass *class) {
 3   GObjectClass *object_class = G_OBJECT_CLASS (class);
 4 
 5   object_class->dispose = tfe_text_view_dispose;
 6   tfe_text_view_signals[CHANGE_FILE] = g_signal_new ("change-file",
 7                                  G_TYPE_FROM_CLASS (class),
 8                                  G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
 9                                  0 /* class offset */,
10                                  NULL /* accumulator */,
11                                  NULL /* accumulator data */,
12                                  NULL /* C marshaller */,
13                                  G_TYPE_NONE /* return_type */,
14                                  0     /* n_params */
15                                  );
16   tfe_text_view_signals[OPEN_RESPONSE] = g_signal_new ("open-response",
17                                  G_TYPE_FROM_CLASS (class),
18                                  G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
19                                  0 /* class offset */,
20                                  NULL /* accumulator */,
21                                  NULL /* accumulator data */,
22                                  NULL /* C marshaller */,
23                                  G_TYPE_NONE /* return_type */,
24                                  1     /* n_params */,
25                                  G_TYPE_INT
26                                  );
27 }
  • 6-15:注册“change-file”信号。g_signal_new函数被使用。信号“change-file”没有默认处理程序(object method handler),因此偏移量(第9行)设置为零。通常不需要默认处理程序。如果需要,请使用g_signal_new_class_handler函数而不是g_signal_new。更多信息请参见GObject API参考。
  • g_signal_new的返回值是信号id。signal id的类型是guint,与unsigned int相同。它在函数g_signal_emit中使用。
  • 16-26:表示“open-response”信号。这个信号有一个参数。
  • 24:参数个数。“open-response”信号只有一个参数。
  • 25:参数类型。G_TYPE_INT是整数类型。这些基本类型在GObject参考手册中有描述。

处理程序声明如下。

/* "change-file" signal handler */
void
user_function (TfeTextView *tv,
               gpointer user_data)

/* "open-response" signal handler */
void
user_function (TfeTextView *tv,
               TfeTextViewOpenResponseType response-id,
               gpointer user_data)
  • 因为“change-file”信号没有参数,所以处理程序的参数是一个TfeTextView实例和用户数据。
  • 因为“open-response”信号只有一个参数,所以处理程序的参数是一个TfeTextView实例、信号的参数和用户数据。
  • tv是发射信号的对象实例。
  • user_data来自g_signal_connect的第四个参数。
  • parameter来自g_signal_emit的第四个参数。

参数的值在tfetextview.h中定义,因为它们是公有的。

/* "open-response" signal response */
enum
{
  TFE_OPEN_RESPONSE_SUCCESS,
  TFE_OPEN_RESPONSE_CANCEL,
  TFE_OPEN_RESPONSE_ERROR
};
  • 当tfe_text_view_open成功打开并读取文件时,该参数设置为TFE_OPEN_RESPONSE_SUCCESS。
  • 当用户取消时,该参数设置为TFE_OPEN_RESPONSE_CANCEL。
  • 当发生错误时,该参数设置为TFE_OPEN_RESPONSE_ERROR。

3 信号连接

信号和处理程序通过函数g_signal_connect连接起来。还有一些类似的函数,如g_signal_connect_after、g_signal_connect_等。但g_signal_connect是最常见的。信号“change-file”连接到TfeTextView对象外的回调函数。以同样的方式,信号“open-response”连接到TfeTextView对象外的回调函数。这些回调函数由用户定义。

在程序tfe中,回调函数定义在tfenotebook.c中。它们的名字是file_changed和open_response。稍后会解释。

g_signal_connect (GTK_TEXT_VIEW (tv), "change-file", G_CALLBACK (file_changed), nb);

g_signal_connect (TFE_TEXT_VIEW (tv), "open-response", G_CALLBACK (open_response), nb);

4 信号发射

信号是在实例上发出的。该实例的类型是g_signal_new的第二个参数。信号和对象类型之间的关系在信号注册时确定。

函数g_signal_emit用于发出信号。下面几行是从tfetextview.c中提取的。每一行都来自不同的一行。

g_signal_emit (tv, tfe_text_view_signals[CHANGE_FILE], 0);
g_signal_emit (tv, tfe_text_view_signals[OPEN_RESPONSE], 0, TFE_OPEN_RESPONSE_SUCCESS);
g_signal_emit (tv, tfe_text_view_signals[OPEN_RESPONSE], 0, TFE_OPEN_RESPONSE_CANCEL);
g_signal_emit (tv, tfe_text_view_signals[OPEN_RESPONSE], 0, TFE_OPEN_RESPONSE_ERROR);
  • 第一个参数是发出信号的实例。
  • 第二个参数是信号id。
  • 第三个参数是信号的细节。“change-file”信号和“open-response”信号没有细节,当没有细节时参数为0。
  • “change-file”信号没有参数,所以没有第四个参数。
  • “open-response”信号只有一个参数。第四个参数是传向回调函数的变量。
九、Gtk4-UI设计工具Cambalache和Drafting Ubuntu 22.04 adm64 (作者在Ubuntu20.04 arm64系统安装过,但是按照Gobject-intro包,会造成啊appindictor错误,无法开机进入桌面,由于知识水平和时间有限,没有寻找原因)文中前一部分重复了第一节Gtk4编译过程(因为Cambalache需要broadway-backend=true) 阅读详情

相关推荐

gtk4学习

前几天学习GDB,下载了张老师写的一个GTK图形程序,在我ubuntu机器上运行不了,界面直接死掉了。所以今天准备简单学习一下gtk。

hb_zxl的专栏 1611

二十五、Gtk4-多线程分析

首先回顾一下GLib,GObject,GIO,Gtk的不同,因为下面会涉及到这些概念里面的函数。所有这些都是由Gnome项目开发的库,一般都用于Gnome环境相关的应用程序。

Creationyang的博客 1529

GTK3.0高级控件(万字详解+源码)

3.4.1 GTK3.0的GtkTreeView:树视图 3.4.1 GTK3.0的GtkListBox:列表框 3.4.1 GTK3.0的GtkFlowBox:流动框 3.4.1 GTK3.0的GtkIconView:图标视图 3.4.1 GTK3.0的GtkSpinButton:旋转按钮(数值输入) 3.4.1 GTK3.0的GtkSpinner:旋转器(加载动画) 3.4.1 GTK3.0的GtkFrame:框架 3.4.1 GTK3.0的GtkAspectFrame:宽高比框架 3.4.1 GTK3

啊渊的专栏 947

gtk学习总结:GTK从入门到放弃,三天包教包会

今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃。文中有些代码例子可能来自《GTK从入门到精通》吧,我不记得了,或者叫《GTK中文教程》,忘记了,总之,这是一个学习笔记,希望不触及任何人的利益,起到共享学习之用。 目录 编译方法 编译脚本 01.一个简单的按钮 02.两个按钮 03.vbox:一...

RToax 4万+

[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)

这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。前文分享了Wireshark安装入门和一个抓取网站用户名和密码的案例,本篇文章将继续深入学习Wireshark的抓包原理知识,并分享数据流追踪、专家信息操作,最后结合NetworkMiner工具抓取了图像资源和用户名密码。本文参考了PingingLab陈鑫杰老师的部分内容,非常推荐大家观看他的教程。同时,Bilibili是学习网络安全和编程的好地方喔,大家可以去试试。

杨秀璋的专栏 3万+

【QT教程笔记】本专栏内容概括与简介

本专栏提供系统的Qt开发教程,面向初级开发者、学生及转型开发者。内容涵盖Qt基础入门、核心组件、高级特性及项目实战四大模块,包括环境搭建、内存管理、信号槽机制、多线程、网络编程等核心知识点。采用图文结合、代码规范的教学方式,每章节配有实战案例,循序渐进地帮助读者掌握Qt开发技能。通过系统学习,读者将能够开发多媒体播放器、图形编辑器等实际项目,并具备国际化支持能力。

yuhuasheng1997的博客 525

PyGobject(六十二)Gtk.Widget之Gtk.Label

Gtk.LabelGtk.Label显示文本部件,常用来嵌入其它部件,如 Gtk.Button、Gtk.MenuItem、 Gtk.ComboBox等.继承关系 Methods 方法修饰词 方法名及参数 static new (str) static new_with_mnemonic (str) get_angle () get_attributes (

Yu的专栏 2182

基于MFC的电子琴程序设计:从音符频率到waveOut发声实现

计算机发声是多媒体编程与嵌入式系统开发中的基础能力,涉及方波生成、PCM采样、音频输出等核心技术。理解声音的本质——频率决定音高,振幅决定音量,是构建电子乐器类应用的前提。在Windows平台上,实现发声可选择Beep、PlaySound或waveOut等不同层级的API,其中waveOut支持动态合成波形,能获得更丰富的音色表现,也更能体现对音频原理的掌握。在课程设计或工程实践中,电子琴项目综合运用了十二平均律、消息驱动机制、键盘映射与实时信号处理,是连接微机原理与GUI开发的良好载体。本文围绕MFC框架

weixin_33938733的博客 358

PyGobject(七十二)Gtk.Widget之Gtk.SearchEntry

Gtk.SearchEntryGtk.SearchEntry搜索输入框 继承关系Gtk.SearchEntry是Gtk.Entry的直接子类 Methods 方法修饰词 方法名及参数 static new () handle_event (event) Virtual Methods do_next_match () do_previous_match ()

Yu的专栏 1829

Gtk4-tutorial:gtk4初学者教程

Gtk4初学者教程 本教程说明了如何使用Gtk4库编写C程序。 它侧重于初学者,因此其内容仅限于基本事物,例如小部件,GObject,信号,菜单和构建系统。 请参考以获取更多主题。 本教程正在开发中,不稳定。 即使使用C语言编写的示例已在gtk4版本4.0上进行了测试,但可能仍存在错误。 如果您在本教程和C示例中发现任何错误,错误或错误,请告诉我。 您可以将其发布到 。 本教程的最新版本位于。 您可以阅读而无需下载。

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 408

PyGobject(五十二)布局容器之Paned

Gtk.Paned分隔面板布局,有左右分隔和上下分隔两种。可拖动分隔线,来调整两个子孩子的大小

Yu的专栏 1734

GD32F105RBT6 keil工程模板

创建GD32F105RBT6的keil初始基础工程,未来的所有外设驱动都是基于这个基础工程进行扩展。

RMDYBW的博客 1925

PyGobject(八十二)Drag and Drop

在部件之间进行拖放,一般需要设置一个拖动源(拖动什么部件),使用Gtk.Widget.drag_source_set()方法,设置一个拖动目标(部件拖放到什么地方),使用Gtk.Widget.drag_dest_set()方法。有些部件提供了特殊的方法来替代这两个方法,如 Gtk.TreeView 和 Gtk.IconView,它们提供enable_model_drag_source(start_b

Yu的专栏 1478

Xilinx VU+系列多DIE FPGA时序约束与跨DIE信号优化策略

本文深入探讨了Xilinx VU+系列多DIE FPGA的时序约束与跨DIE信号优化策略。针对2.5D/3D封装技术带来的时序挑战,详细解析了SLR区域约束、Laguna寄存器配置及跨时钟域约束等关键技术,提供了实用的TCL脚本和RTL优化示例,帮助开发者有效提升设计性能和时序收敛效率。

weixin_29209801的博客 653

基于555定时器的D类功放设计:从PWM原理到无反馈电路实践

D类功放(数字功放)是一种高效率的音频放大技术,其核心原理是脉冲宽度调制(PWM)。它将输入的模拟音频信号转换为一系列高速开关的脉冲,通过控制功率开关管(如MOSFET)的通断,再经低通滤波器还原放大后的音频。相比传统AB类功放,其转换效率通常超过90%,显著降低了热能损耗。这项技术在追求高能效和小型化的现代音频设备中价值凸显,广泛应用于有源音箱、汽车音响和便携式设备。本文聚焦于一种独特的实现方案:以经典的555定时器芯片为核心,构建一个无整体负反馈的D类功放。通过剖析其PWM调制器、FET电压-电流转换级

weixin_30162121的博客 220

PyGobject(二十二)布局容器之Frame

Gtk.Frame 四周显示边框,并且有一个文本,通常显示在左上角,可以通过Gtk.Frame.set_label_align()方法设置文本位置 Gtk.Frame是Gtk.Bin的直接子类

Yu的专栏 1521

TMS320F280049C 学习笔记21 交叉开关 Crossbar (X-BAR)

简单介绍了X-BAR。

whyorwhnt的专栏 2万+

GTK+图形化应用程序开发学习笔记(十二)—对话框构件、标尺构件(1)

 一、对话框构件       对话框构件非常简单,事实上它仅仅是一个预先组装了几个构件到里面的窗口。对话框的定义如下:       struct GtkDialog{GtkWindow window; GtkWidget *vbox;GtkWidget *action_area;};从上面可以看到,对话框只是简单地创建一个窗口,并在顶部组装一个G t k V B o

紫侠的天空 1184

网卡Inter (R) Wi-Fi 6 AX201突然故障 错误代码10,无法找到无线网络,蓝牙也无效了

问题描述 说来也是坑,简直就莫名其妙。早上在工位上,电脑一切正常(一直用的是无线网络),然后周五准备开周会了,所以拔掉电脑外接设备(电源线,鼠标,外接显示器)拿起电脑到会议室。到了会议室之后,无线网断开了(但一般是不会断开的,都在公司范围内),所以选择重连,但发现已经没有无线网络列表了。 电脑机型:联想YOGA 14s 2021 初步尝试 1、关闭开始飞行模式 - 无果 2、重启并重启 (因为前两天已经提醒过有windows更新,趁这个机会就更新并重启了)- 无果 3、下载鲁大师、驱动精灵、联想驱动管

疯狂的蜗牛 5万+

解码器选型参数,结构原理,工艺与注意问题总结

解码器芯片(Decoder Chip)是电子设备中的一个重要组件,通常用于处理、解释和输出存储在某种编码格式中的数据或信号。本文对解码器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1168

【python】【Linux】PyGTK模块的使用-PyGTK 范围等级 【二十二】

此类充当小部件的基类,这些小部件可让用户在上下限之间调整数字参数的值。比例小部件(gtk.Hscale和gtk.Vscale)和滚动条小部件(gtk.HScrollbar和gtk.VScrollbar)从Range类派生功能。这些范围小部件与Adjustment对象一起使用。 gtk.Range类的以下重要功能由Scale和Scrollbar小部件实现- set_update_policy...

rong11417的博客 612

Android 14.0 系统开机屏幕设置默认横屏显示

在14.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 2150

PyGobject(三十二)布局容器之Window

Gtk.Window是一个可以包含其他部件一个顶层窗口。允许用户操作窗口(调整其大小,移动它,关闭它,...)

Yu的专栏 2678

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Python】【Linux】PyGTK模块的使用-目录

【Python】【Linux】PyGTK模块的使用-大全 PyGTK demo github项目地址:https://github.com/rong11417/PyGTK_demo 教程 1.【python】【linux】PyGTK模块的使用-PyGTK简介安装【一】 2.【python】【linux】PyGTK模块的使用-PyGTK部件介绍【二】 3.【python】【Linux】...

rong11417的博客 946

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Qt开发入门:从零到跨平台GUI低手

Qt开发入门:从零到跨平台GUI低手

Yusei_0523的博客 545

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 十一、Gtk4-Instance Initialization and destruction
下一篇: 十三、Gtk4-TfeTextView函数
李尔阳
博客等级 码龄7年 50粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值