14-3 编写第一个 GTK 程序

2023-11-16

1. Hello World

        GTK 是事件驱动的工具包

        从数据处理角度,当一个事件发生时,如点击一次鼠标,所按的构件便会发出信号。所以使用 GTK 编写 hello world 时,构件需要与信号进行绑定。信号和构件的绑定函数有两种:g_signal_connect 与 g_signal_connect_swappedhttps://blog.csdn.net/shaoguangleo/article/details/6852689)。两者最大的不同点为,g_signal_connect() 函数绑定时回调函数是两个参数,主要目的是为了接收用户传入的数据g_signal_connect_swapped() 函数绑定时回调函数仅接收一个参数(构件对象),目的是为了处理构件的相关操作,而不是数据

        对于 UI 界面,不同构件之间的绑定需要注意类型的强转。窗口,容器,按钮盒,按钮之间的关系一定要理清:按钮绑定在按钮盒,按钮盒绑定在窗口。绑定时需要将被绑定对象转为容器进行绑定,例如按钮绑定在按钮盒,此时按钮盒需要强转为容器;按钮盒绑定在窗口,窗口需要强转为容器。

#include <gtk/gtk.h>

/*
 * 定义一个打印函数,在点击按钮时调用该函数
 * @param widget: 相当于GtkContainer 容器类的父类
 * @param data: 用户点击按钮时传入的数据
 */
static void print_hello(GtkWidget *widget, gpointer data){
  g_print("hello world!\n");
}

// 程序创建时调用的 activate 函数
static void activate(GtkApplication *app, gpointer user_data){

  // 1. 设置窗口
  // 为程序创建一个窗口
  GtkWidget *window = gtk_application_window_new(app);

  // 设定窗口名称,接收 GtkWindow* 类型的参数,故需要强转(GtkWidget可看作是GtkWindow的父类)
  gtk_window_set_title(GTK_WINDOW(window), "HelloWorld");

  // 设定窗口大小,接收 GtkWindow* 类型的参数
  gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);

  // 2. 设置窗口内部各组件
  // 设定按钮盒子,里面可以存放多个按钮,接收的参数含义为按钮横向排列
  GtkButtonBox *button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);

  // 设定按钮
  GtkButton *button = gtk_button_new_with_label("Hello World");

  // 将按钮与按钮盒绑定在一起,接收参数类型为 GtkContainer*,故此处进行强转
  gtk_container_add(GTK_CONTAINER(button_box), button);

  // 将按钮盒与窗口绑定在一起
  gtk_container_add(GTK_CONTAINER(window), button_box);

  // 3. 按钮绑定两个事件
  // 绑定按钮点击事件,点击时执行函数print_hello。执行该函数时传入数据为NULL,即print_hello函数第二个参数接收为NULL
  g_signal_connect(button, "clicked", G_CALLBACK(print_hello), NULL);

  // 绑定按钮事件,点击后自动退出该窗口,故回调函数功能为退出窗口,参数为窗口对象window
  // g_signal_connect_swapped()回调函数仅传一个参数,一个指向 GTK 对象的指针
  g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_window_close), window);

  // 4. 显示窗口, 传入窗口对象window
  gtk_widget_show_all(window);
}

int main(int argc, char **argv) {

  // 创建一个程序
  GtkApplication *app = gtk_application_new("com.gltzlike.clang", G_APPLICATION_FLAGS_NONE);

  // 程序创建时发出信号,进行相应的函数绑定
  // 绑定的对象是程序app,绑定信号是“activate”,绑定的函数名称为 activate,绑定时需要传入的数据为NULL
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);

  // 运行该程序,返回状态码
  // 接收参数,其中第一个参数为GApplication *,是GtkApplication的父类;
  // 第二个和第三个参数是主程序参数(主程序运行时的参数),argc:传入的参数个数,argv:传入的参数字符串数组
  int status = g_application_run(app, argc, argv);

  // g_application_run() 函数启动后,会陷入死循环,一直监听窗口的动态(例如移动窗口,点击窗口),直到窗口退出才会返回status
  // 窗口退出后,需要释放内存
  // 调用g_object_unref()函数解引用,让app有资格释放内存
  g_object_unref(app);

  return status;
}

        最终程序运行结果如下,启动该程序,弹出窗口。

         点击 Hello World 按钮,控制台输出 "hello world!",同时窗口退出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

14-3 编写第一个 GTK 程序 的相关文章

随机推荐

  • 极简化版-无root实现抓包-VMOS+HttpCanary(小黄鸟)抓包-解决抓包时无网络问题

    文章目录 前言 一 真机中的操作 分别安装以下应用 二 安装vmos的操作 三 vmos的操作 四 解决抓包时无网络问题 建议 前言 适用大部分手机 实现各种抓包 一 真机中的操作 分别安装以下应用 vmos 自行下载 小黄鸟 https
  • 冉起新秀:Apache六大尚未广为人知的大数据项目

    原文地址 On the Rise Six Unsung Apache Big Data Projects 作者 SAM DEAN 译者 吴洁 世界各地无数的组织 他们使用的数据现在日益庞大而复杂 使用传统的数据处理程序已无法再进行优化分析及
  • mysql命令、mysqldump命令找不到解决

    1 解决bash mysql command not found 的方法 root DB 02 mysql u root bash mysql command not found 原因 这是由于系统默认会查找 usr bin下的命令 如果这
  • spring boot发布脚本

    venus deploy sh bin bash P PATH usr local venus P PATH venus sh stop CUR DATE date Y m d H M S mv P PATH venus web jar P
  • ffmpeg 录制和播出复用流(多节目流)

    ffmpeg 录制和播出复用流 多节目流 此处的播放还是录制的意思 录制是存成文件 播放是用udp的协议发送出去 故此处播放的含义还是录制的意思 复用流录制 假如有一个复用流 包含4个节目 如下 ffmpeg probesize 10000
  • pip安装python库出现:ModuleNotFoundError: No module named 'setuptools._deprecation_warning'

    Could not import setuptools which is required to install from a source distribution Traceback most recent call last File
  • 机器学习 朴素贝叶斯之邮件分类

    目录 一 贝叶斯算法 1 先验概率 2 后验概率 3 贝叶斯定理 4 概率模型 二 朴素贝叶斯分类器 1 朴素贝叶斯分类 2 拉普拉斯修正 3 防溢出策略 4 垃圾邮件分类 三 利用朴素贝叶斯分类对于电子邮件分类 1 使用的数据集 2 相关
  • Ubuntu16.04下交叉编译适配openwrt(CC版本)的swoole扩展库(swoole-1.10.3)

    Ubuntu16 04下交叉编译适配openwrt CC版本 的swoole扩展库 swoole 1 10 3 文章目录 Ubuntu16 04下交叉编译适配openwrt CC版本 的swoole扩展库 swoole 1 10 3 一 简
  • thinkphp6 入门(5)-- 模型是什么 怎么用

    一 模型 MVC架构 之前开发一个功能 后端为在控制器 C 中写 php SQL 前端为在页面 V 中写html css js 这就形成了 VC 架构 但是发现 相同的数据逻辑 SQL 在不同的功能中可能被用到 所以可以把数据逻辑 SQL
  • Mysql优化4-合适的索引

    四中索引 普通索引 主键索引 唯一索引 全文索引 一 索引的CURD 1 添加 1 1 主键索引添加 把一张表的一个字段设置为主键 该字段就位主键索引 id int unsigned primary key auto increment u
  • 注册表知识和技巧大全

    注册表知识和技巧大全 注册表基础 系统文件夹 名称 路径 含义 AppData C Windows Application Data 应用程序 Cache C Windows Temporary Internet Files 浏览器缓存 C
  • 【光电设计大赛】非接触酒精浓度测量中放大器和ADC模块误差分析

    放大器误差分析 微小信号测量实验中 主要会对结果造成影响有失调电压和噪声 噪声有外界电磁干扰噪声和运放本身的固有噪声 失调电压可以通过在输入端加入反向电压来消除 通过放大器的调零按钮使失调电压降低到很小 外界电磁噪声可以通过电磁屏蔽消除 但
  • 7-1 设计一个学生类和它的一个子类——本科生类(interface接口)

    设计一个学生类 Student 和它的一个子类 本科生类 Undergraduate 要求如下 1 Student类有姓名 name 和年龄 age 属性 两者的访问权限为protected 一个包含两个参数的构造方法 用于给姓名和年龄属性
  • uWSGI+nginx+supervisor部署django项目

    本文主要介绍如何编译nginx uwsgi以及supervisor 配置文件实现django项目启动 01 为什么用django nginx uwsgi Django本身只是一个基于Python语言写的一个开源WEb框架 不具备服务器网关功
  • 恭喜ULAM团队在数字版权领域的研究上有了新突破

    恭喜北京清链华识科技有限公司在数字版权领域的研究上有了新的突破 其中团队所研究的课题 基于区块链技术的数字版权管理应用研究 得到了河北省科学院的认可 并且在 河北省科学院学报 的 大数据与区块链技术专刊 上成功刊登 河北省科学院学报 是由河
  • 什么是JDBC,JDBC的主要功能是什么?

    JDBC Java Data Base Connectivity 是Java连接数据库的一门技术 是一种执行SQL的API 可以为多种关系型数据库提供统一的访问功能 它是由一组用java语言编写的类和接口组成 是Java访问数据库的标准规范
  • Vue Element Select选择器自定义验证规则

    前言 在我们在做增删改查的时候 一般会遇到添加和修改的from表单需要表单验证 一般常规的from表单是有自己的验证规则 from加一个 rules rules 但他需要v model值和prop值要一样 这是常规情况 我遇到的是 绑定多个
  • 5.监听器(Listener)

    1 监听器简介 监听器主要用来监听对象的创建 属性的变化 是一个实现特定接口的普通Java类 Listener接口与事件对应表 与 ServletContext 有关 ServletContextListener ServletContex
  • 前端Ant Design Pro搭建流程

    全局安装tyarn npm i g tyarn 全局安装ant design pro脚手架 npm i ant design pro cli g 使用脚手架创建项目 pro create myapp gt 选择umi 3 gt 选择simp
  • 14-3 编写第一个 GTK 程序

    1 Hello World GTK 是事件驱动的工具包 从数据处理角度 当一个事件发生时 如点击一次鼠标 所按的构件便会发出信号 所以使用 GTK 编写 hello world 时 构件需要与信号进行绑定 信号和构件的绑定函数有两种 g s