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 程序 的相关文章

  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 极简化版-无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