1. 使用 glade 新增对象及信号

前端:使用 glade 修改布局与信号。例如,在 glade 中新建对象 GtkTextBuffer,在将其 id 命名为 button2_data,内容为 “你好,中国!”。

设置构件按钮2点击信号的回调函数为 print_hello2,且在调用该函数时传入 GtkTextBuffer 对象类型的 button2_data 参数。

2. 实现代码与 glade 新增对象及信号的链接

后端:修改代码,实现前端修改的样式。理想结果为,点击按钮2,控制台出现“你好,中国!”。具体修改流程为:

1)绑定 glade 中设置的信号需要借用 gmodule 库的函数。前往 msys/mingw64.exe,使用如下代码查询 gmodule 包名称。

pkg-config --list-all | grep gmodule

2)修改配置文件,引入 gmodule 库。

cmake_minimum_required(VERSION 3.17)get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} C)set(CMAKE_C_STANDARD 11)## 使用 Cmake 找到 GTK 框架位置
FIND_PACKAGE(PkgConfig REQUIRED)  # 声明使用pkg去找
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)  # pkg 找到 gtk+-3.0的框架,并将其命名为 GTK3# 引入 GTK 框架的头文件
INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS})# 引入 GTK 框架的链接库
LINK_DIRECTORIES(${GTK3_LIBRARY_DIRS})# 引入 GTK 编译时所需要的参数
ADD_DEFINITIONS(${GTK3_CFLAGS_OTHER})include_directories("include")## 引入 gmodule
FIND_PACKAGE(PkgConfig REQUIRED)  # 声明使用pkg去找
PKG_CHECK_MODULES(GMODULE REQUIRED gmodule-export-2.0)  # pkg 找到 gmodule-export-2.0 的框架,并将其命名为 GMODULE# 引入 gmodule 框架的头文件
INCLUDE_DIRECTORIES(${GMODULE_INCLUDE_DIRS})# 引入 gmodule 框架的链接库
LINK_DIRECTORIES(${GMODULE_LIBRARY_DIRS})## 编译.c
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
foreach(file ${files})get_filename_component(name ${file} NAME)add_executable(${name} ${file})# 将可执行程序与链接库进行链接(放置一起)target_link_libraries(${name} ${GTK3_LIBRARIES})target_link_libraries(${name} ${GMODULE_LIBRARIES})  # 将 GMODULE编译的可执行程序与链接库放置一起endforeach()

3)修改相应代码,使代码能够获取到 glade 修改的 ui 文件中的布局及信号

#include <gtk/gtk.h>/** 定义一个打印函数,在点击按钮时调用该函数* @param widget: 相当于GtkContainer 容器类的父类* @param data: 用户点击按钮时传入的数据*/
static void print_hello(GtkWidget *widget, char const *data){g_print("hello: %s\n", data);
}// 传入 GTKTextBuffer 类型数据
// 加 G_MODULE_EXPORT 相当于将函数名暴露出去,让 glade 可以识别到
G_MODULE_EXPORT void print_hello2(GtkWidget *widget, GtkTextBuffer *buffer){// 获取 GtkTextBuffer 内容,可以选定获取buffer中某一段字符串// 设置字符串起始位置GtkTextIter start;gtk_text_buffer_get_start_iter(buffer, &start);// 获取字符串末尾位置GtkTextIter end;gtk_text_buffer_get_end_iter(buffer, &end);// 获取 Buffer 内容,gtk_text_buffer_get_text 最后一个参数判断是否有隐藏字符g_print("hello2: %s\n", gtk_text_buffer_get_text(buffer, &start, &end, FALSE));
}// 给定 ui 文件,进行 helloworld 程序编写
int main(int argc, char **argv){gtk_init(&argc, &argv);// 1. 加载布局文件 builder.ui// 新建builderGtkBuilder *builder = gtk_builder_new();// 利用 builder 加载布局文件GError *error = NULL;if(gtk_builder_add_from_file(builder, "builder2.ui", &error) == 0){  // 如果加载失败g_printerr("Error loading files: %s\n", error->message);g_clear_error(&error);  // 退出之前不要忘记释放相应内存return -1;}// 2. 获取布局文件中各构件,利用 ui 文件中的各构件 id 进行获取// 获取窗口对象,其在 ui 文件中的 id 为 "window"GObject *window = gtk_builder_get_object(builder, "window");// 获取按钮1,按钮2,以及退出按钮GObject *button1 = gtk_builder_get_object(builder, "button1");GObject *button2 = gtk_builder_get_object(builder, "button2");GObject *quit = gtk_builder_get_object(builder, "quit");// 3. 对各构件进行事件的绑定// 对窗口进行事件绑定// destroy 相当于点击窗体右上角的 x 按钮,不绑定的情况下,点击 x 窗口消失,但主程序并不会退出,仍在后台运行g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);// 对按钮进行事件绑定g_signal_connect(button1, "clicked", G_CALLBACK(print_hello), "button1");g_signal_connect(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL);  // 绑定退出函数// 绑定 glade 中设置的信号 (glade 设置的信号全部保存在了 ui 文件中)// 第二个参数含义为传给 ui 文件中所有信号的一个参数,不同信号按理说应该接收的不一样,故此处设置为NULLgtk_builder_connect_signals(builder, NULL);// 4. 运行该窗口程序gtk_main();// 5. builder 解引用,让其可以释放内存。可以解引用的原因是已经利用builder加载了布局,获取了各构件g_object_unref(builder);return 0;
}

4)执行程序,验证修改结果:

14-6 使用 glade 完成布局相关推荐

  1. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  2. 玩转文字!汉字海报的布局排版形式成功案例,给你灵感!

    汉字字体海报如何设计?这里采集了14款汉字海报的布局排版形式,来看看他们是如何运用汉字进行设计的. 更多汉字设计排版灵感作品,到乐于分享设计资源的集设网 www.ijishe.com 集设网(ijis ...

  3. trans【Total3DUnderstanding】论文翻译+解读学习 2020.10.14

    Total3D Understanding 摘要 1 Introduction 2 related work 3 Method 3.1 3D目标检测和布局估计 3.2. Mesh Generation ...

  4. Multisim 14.3安装包下载链接及安装教程

    一.下载链接 ①百度网盘下载链接: https://pan.baidu.com/s/1cBQ_PtRVU9mhOHElNZz0OA?pwd=0404 ②夸克网盘下载链接: https://pan.qu ...

  5. Android中相对布局是,Android之相对布局

    Android中的布局分为六种,分别是相对布局.线性布局.表格布局.网格布局.帧布局.绝对布局,良好的布局设计对UI界面至关重要,下面先来看看先相对布局. 相对布局(RelativeLayout): ...

  6. 计算机制图的相关标准,14 计算机制图规则 - 房屋建筑制图统一标准 GB/T50001-2010 - 消防规范大全 - 消防资源网!...

    14.0.1 计算机制图的方向与指北针应符合下列规定: 1 平面图与总平面图的方向宜保持一致: 2 绘制正交平面图时,宜使定位轴线与图框边线平行(图14.0.1-1): 3 绘制由几个局部正交区域组成 ...

  7. flex布局详细教程

    flex布局 网页布局(layout)是CSS的一个重点应用. 传统的布局有下面几种. display: block; display: inline; display: list-item; dis ...

  8. 阿里云:国际化是云计算技术能力的照妖镜

    16日,阿里云在东京帝国大厦举行了一场有国际业务布局的媒体沟通会.随着阿里每季财报都特别指出阿里云的市场业绩,让越来越多的科技互联网媒体关注到了阿里云的市场表现,再加亚马逊以云计算业务AWS为主要营收 ...

  9. VMWare安装Linux系统之CentOS-6.6

    1.使用VMWare创建新的虚拟主机,首先打开VMware 2.使用VMWare安装Linux,点击"开启虚拟主机" 3.进入Linux安装界面,选择第一项"Instal ...

最新文章

  1. python做电脑软件-程序员带你十天快速入门Python,玩转电脑软件开发(二)
  2. Ubuntu下利用JDK的Keytool配置Tomcat7.0的SSL协议(单向认证简易版)
  3. 根据文法画出语法树_更多确定子句语法
  4. SQL Server 磁盘空间告急(磁盘扩容)转载
  5. 基于某网站的信息爬取与保存_指定跳转页
  6. 【STM32】I2C详解
  7. emc re 整改 超标_老刘工程师睡前故事5-EMC 辐射发射超标怎么办?
  8. html载入hta文件,HTA文件去除html控件认证和接收命令行参数
  9. 1.3 编程基础之算术表达式与顺序执行 04 带余除法
  10. 项目管理之道之沟通管理-外部接口只能有一个
  11. python实现文件格式转换_python实现快速文件格式批量转换的方法
  12. Apache 软件基金会:顶级项目仍使用老旧软件,补丁作用被削弱
  13. python︱Anaconda安装、简介(安装报错问题解决、Jupyter Notebook)
  14. VC2010 sp1修复补丁
  15. 如何十步写好一份值钱的商业计划书
  16. linux 格式化u盘 fat32,Ubuntu下格式化U盘的方法(基于格式化命令)
  17. python爬虫——爬取小说
  18. 独立站SEO到底怎么做?
  19. “2.17亿中国电信”拿下国家税务局云平台项目,H3C却是最大赢家
  20. 如何开一场高效的迭代排期会 | 敏捷开发落地指南

热门文章

  1. Prometheus监控搭建(4)PrometheusAlert 配置
  2. Smoke Test And Ad hoc Test
  3. 拼多多商家引流方法:新手一定要知道的几个引流方法!拼多多补单软件
  4. 80后站长建站的经验总结
  5. 对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离
  6. TypeError: sequence item 0: expected string, int found
  7. ghost还原服务器系统,Ghost超详细图文教程 – 还原恢复系统全程图解(上部)
  8. 计算机科普知识ppt,科普知识计算机是我们小助手.ppt
  9. 骚年都2020年了你还在用EventBus吗?jetpack之liveData
  10. 国之骄傲,清华IT大牛带领一群年青程序员叫板美国!