Linux系统 C/C++编程基础——基于GTK+的图形用户界面编程
ℹ️大家好,我是练小杰,今天星期三了,距离除夕又少了一天,新年的钟声就快敲响了😆
本文是有关Linux C/C++编程中的基于GTK+的图形用户界面编程知识点,后续会不断添加相关内容 ~~
回顾:【使用make工具和Makefile实现自动编译】
更多Linux 相关内容请点击👉【Linux专栏】

文章目录
- GTK+简介
- GTK+的优势
- GTK+的应用领域
- GTK+ 的编程基础
- 部署GTK+编程环境
- 安装GTK+ 3开发包
- 安装构建工具
- 安装其他必要的库和工具
- 配置环境变量
- 测试GTK+编程
- pkg-config工具
- Glade辅助设计界面
- Glade简介
- 主要特点
- Glade安装
- 使用Glade设计图形用户界面
- 新建一个Glade项目
- 选择顶层容器
- 选择显示组件
- Glade项目
- GTK+结合Glade进行编程
- 部署集成开发环境Anjuta
- Anjuta简介
- Anjuta 的主要特点
- Ubuntu系统中安装Anjuta
- Anjuta常见问题及解决方法
- Anjuta基本使用(图形界面)
- Anjuta初始界面
- 选择项目类型
- 设置项目基本信息
- 设置项目选项
- 项目结构
- 项目的目录及文件
- 启动图形界面文件编辑
- 调用Glade编辑图形界面文件
- 设置程序参数
- Anjuta创建的应用程序
- 制作项目
- 进行编译

GTK+简介
GTK+是一套跨多种平台的开放源码图形用户界面工具包。- GTK+类似于Windows上的MFC和Win32 API、JAVA上的Swing和SWT,是Linux下开发
GUI应用程序的主流开发工具之一。 - GTK+可以用来进行跨平台GUI应用程序的开发。
- GTK+开发套件基于3个主要的库:
Glib、Pango和ATK GNOME桌面环境以GTK+为基础,为GNOME编写的程序使用GTK+作为其工具箱。
GTK+的优势
-
跨平台性:GTK+支持多种操作系统,包括Linux、Windows和macOS,使得开发者可以使用相同的代码库开发出可在不同平台上运行的应用程序。
-
开源和免费:GTK+基于LGPL许可证发布,开发者可以自由地使用、修改和分发GTK+,无需支付任何费用。
-
支持多种编程语言绑定:GTK+提供了多种编程语言的绑定,包括C++、Python、JavaScript、Rust等,方便不同背景的开发者使用。
-
丰富的组件和功能:GTK+提供了丰富的GUI组件和功能,包括窗口、按钮、文本框、菜单、对话框等基本组件,以及树形视图、图标视图、进度条等高级组件。
GTK+的应用领域
- 桌面应用程序开发
GTK+是开发Linux和Unix系统下桌面应用程序的主要工具之一,许多流行的开源应用程序,如GIMP、Inkscape、Pidgin等,都是使用GTK+开发的。
- GNOME桌面环境
GNOME是Linux和Unix系统下流行的桌面环境之一,它使用GTK+作为其主要的GUI开发工具包。
- 其他案例
GTK+还被用于开发各种其他类型的应用程序,如嵌入式系统、移动应用程序、Web应用程序等。例如,Firefox浏览器的Linux版本使用GTK+作为其GUI开发工具包。
GTK+ 的编程基础
一个基本的GTK+程序通常由以下几个部分组成:
- 初始化:设置必要的环境变量和初始化
GTK+库。 - 创建窗口和控件:创建应用程序的主窗口以及必要的控件。
- 信号连接:将控件的信号与处理函数连接起来,以响应用户的操作。
- 事件循环:启动GTK+的事件循环,使得应用程序能够响应用户操作。
- 清理和退出:在程序退出时释放资源并关闭应用程序
部署GTK+编程环境
安装GTK+ 3开发包
部署GTK+编程环境首先要提供
gcc、g++、gdb、make等编译工具,然后要安装核心的GTK+开发包。
- 安装GTK+ 3开发包,执行命令如下:
sudo apt update
sudo apt install libgtk-3-dev
这里命令是安装最新的
GTK+开发库及其依赖项。我们也可以从GTK+的官方网站下载源代码并手动编译安装。
- 检查是否安装了GTK+ 3,查看所安装的具体版本。
pkg-config --modversion gtk+-3.0
安装构建工具
为了编译GTK+应用程序,你需要安装C编译器(如
gcc)或者make工具。
sudo apt install build-essential
安装其他必要的库和工具
根据项目需求,我们可能需要安装其他库和工具。以下工具的概念后面会细讲!!
pkg-config用于管理编译时的库依赖
sudo apt install pkg-config
Glade用于可视化设计GTK+用户界面。
sudo apt install glade
- 调试工具,比如
gdb,用于调试GTK+应用程序。
sudo apt install gdb
配置环境变量
一般,包管理器会自动处理环境变量配置。但如果我们从源代码安装
GTK+,需要手动配置PKG_CONFIG_PATH和LD_LIBRARY_PATH变量。
示例:可以将这些行添加到你的~/.bashrc或~/.zshrc文件中,以便每次打开终端时自动设置。
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
测试GTK+编程
#include <gtk/gtk.h>
int main(int argc,char *argv[])
{
/* 声明GtkWidget构件 */
GtkWidget *window;
GtkWidget *label;/* 调用GTK初始化函数,这在所有的GTK程序中都要调用*/
gtk_init(&argc,&argv);/* 创建主窗口*/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);/* 为该窗口设置标题*/
gtk_window_set_title(GTK_WINDOW(window),"Hello World");/* 将窗口的destroy信号连接到函数gtk_main_quit
* 当窗口要被销毁时,获得通告,停止主GTK+循环 */
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);/* 创建“Hello, World”标签 */
label = gtk_label_new("Hello, World!");/* 将标签加入到主窗口 */
gtk_container_add(GTK_CONTAINER(window),label);/* 显示所有的GtkWidget构件,包括窗口、标签*/
gtk_widget_show_all(window);/* GTK程序必须有一个gtk_main()函数启动主循环,等待事件发生并响应,直到应用结束 */
gtk_main();
return 0;
}
pkg-config工具
pkg-config是最为常用的库信息提取工具,通过库提供的一个.pc文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。GTK+及其依赖库支持使用pkg-config工具,通过设置搜索路径来解决寻找库对应的.pc文件的问题,库的头文件的搜索路径的设置变成了对.pc文件搜索路径的设置。
- 使用
pkg-config工具提取库的编译和连接参数的两个基本前提:
- 库本身在安装时必须提供一个相应的
.pc文件;pkg-config必须知道要到何处去寻找.pc文件。
Glade辅助设计界面
Glade简介
- Glade 是一个用于创建和编辑 GTK+ 和 GNOME 应用程序用户界面的开源可视化设计工具。
- 原来
Glade的设计初衷是将界面设计与应用程序代码分离,界面的修改不会影响到应用程序代码。 - 用Glade设计的用户界面是以
XML格式的文件保存的(通常以.glade或.ui结尾),可以通过GTK+对象GtkBuilder被应用程序动态地载入。
主要特点
- 可视化设计
通过拖放组件,开发者可以直观地设计用户界面,而无需手动编写大量的布局和控件代码。
- 支持多种控件
Glade 支持 GTK+ 提供的各种控件,包括窗口、按钮、文本框、树形视图、图标视图等。
- 实时预览
设计界面时,Glade 提供实时预览功能,开发者可以即时看到界面的效果。
- 信号和事件处理
Glade 允许开发者为控件添加信号和事件处理函数,简化了界面与业务逻辑的连接。
- 国际化支持:
Glade 支持界面元素的国际化,可以为不同语言环境设计不同的界面。
- 集成 GTK+ 版本
Glade 支持最新的 GTK+ 版本,包括
GTK+ 3和GTK+ 4,确保开发者可以使用最新的界面组件和功能。
Glade安装
- Glade需要
GTK+ 3支持,所以执行如下命令安装Glade 3工具
sudo apt update
sudo apt install glade
使用Glade设计图形用户界面
- 启动 Glade,可以在终端中输入命令启动 Glade:
glade
新建一个Glade项目

选择顶层容器

选择显示组件

Glade项目

GTK+结合Glade进行编程
#include <gtk/gtk.h>
int main (int argc, char *argv[])
{GtkBuilder *builder;GtkWidget *window; gtk_init (&argc, &argv);builder = gtk_builder_new ();gtk_builder_add_from_file (builder, "hello.glade", NULL);window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));gtk_builder_connect_signals (builder, NULL);g_object_unref (G_OBJECT (builder)); gtk_widget_show_all(window); gtk_main (); return 0;
}
部署集成开发环境Anjuta
Anjuta简介
Anjuta是一个为GTK+/GNOME编写的集成开发环境,除了支持C和C++编程外,还支持Java、JavaScrip和Python语言的编程。
Anjuta 的主要特点
- 自身提供强大的源程序编辑功能
- 借用
Glade工具生成GUI界面- 内嵌代码级的调试器(调用
GDB)- 使用标准的Linux构建系统工具
Autotools- 提供应用程序向导帮助程序员快速创建
GTK+程序,避免编写重复的代码
Ubuntu系统中安装Anjuta
- 确认系统安装有Glade和GTK+,可用如下命令
sudo apt update
sudo apt-get install anjuta
- 安装完成后,通过终端输入以下命令启动 Anjuta
anjuta &
Anjuta常见问题及解决方法
- 依赖问题:如果在安装过程中遇到依赖错误,确保所有必要的开发库已安装。可以使用
apt或dnf安装缺失的依赖包。 - 编译错误:检查编译器和构建系统配置,确保项目设置正确。
- 调试器问题:确保
GDB已安装,并且Anjuta的调试配置正确。
Anjuta基本使用(图形界面)
Anjuta初始界面

选择项目类型

设置项目基本信息

设置项目选项

项目结构

项目的目录及文件

启动图形界面文件编辑

调用Glade编辑图形界面文件

设置程序参数

Anjuta创建的应用程序

制作项目

进行编译

今天晚上的内容到这里就结束了😆
ℹ️如果想了解更多,点击主页【练小杰的CSDN】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!!
明天再见啦,各位🧍大佬们~~

相关文章:
Linux系统 C/C++编程基础——基于GTK+的图形用户界面编程
ℹ️大家好,我是练小杰,今天星期三了,距离除夕又少了一天,新年的钟声就快敲响了😆 本文是有关Linux C/C编程中的基于GTK的图形用户界面编程知识点,后续会不断添加相关内容 ~~ 回顾:【使用make工具和Makefil…...
【Leetcode 每日一题】40. 组合总和 II
问题背景 给定一个候选人编号的集合 c a n d i d a t e s candidates candidates 和一个目标数 t a r g e t target target,找出 c a n d i d a t e s candidates candidates 中所有可以使数字和为 t a r g e t target target 的组合。 c a n d i d a t e s c…...
python 变量范围的定义与用法
文章目录 1. 局部变量(Local Scope)示例: 2. 嵌套函数变量(Enclosing Scope)示例:说明: 3. 全局变量(Global Scope)示例:说明: 4. 内置变量&#…...
TRTC实时对话式AI解决方案,助力人机语音交互极致体验
近年来,AI热度持续攀升,无论是融资规模还是用户热度都大幅增长。2023 年,中国 AI 行业融资规模达2631亿人民币,较2022年上升51%;2024年第二季度,全球 AI 初创企业融资规模为 240 亿美金,较第一季…...
dev c++ ‘unordered_set‘ does not name a type
参考:https://blog.csdn.net/Zaczc/article/details/142531525 启用C11标准步骤 工具->编译选项 勾选编译时加入以下命令 在空白处添加:-stdc11 单击确定,启用成功...
算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)
🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧💪 在算法的…...
three.js+WebGL踩坑经验合集(4.2):为什么不在可视范围内的3D点投影到2D的结果这么不可靠
上一篇,笔者留下了一个问题,three.js内置的THREE.Vector3.project方法算出来的结果对于超出屏幕可见范围的点来说错得相当离谱。 three.jsWebGL踩坑经验合集(4.1):THREE.Line2的射线检测问题(注意本篇说的是Line2,同样也不是阈值…...
Kafka运维宝典 (二)- kafka 查看kafka的运行状态、broker.id不一致导致启动失败问题、topic消息积压量告警监控脚本
Kafka运维宝典 (二) 文章目录 Kafka运维宝典 (二)一、kafka broker.id冲突问题1. broker.id 冲突的影响2. 如何发现 broker.id 冲突3. 解决 broker.id 冲突的方法4. broker.id 配置管理5. 集群启动后确认 broker.id 唯一性6. brok…...
全球AI模型百科全书,亚马逊云科技Bedrock上的100多款AI模型
今天小李哥给大家介绍的是亚马逊云科技上的AI模型管理平台Amazon Bedrock上的Marketplace,这是亚马逊云科技在今年re:Invent发布的一个全新功能,将亚马逊的电商基因带到了其云计算平台,让我们能够通过Amazon Bedrock访问100多种流行、新兴和专…...
微信小程序中常见的 跳转方式 及其特点的表格总结(wx.navigateTo 适合需要返回上一页的场景)
文章目录 详细说明总结wx.navigateTo 的特点为什么 wx.navigateTo 最常用?其他跳转方式的使用频率总结 以下是微信小程序中常见的跳转方式及其特点的表格总结: 跳转方式API 方法特点适用场景wx.navigateTowx.navigateTo({ url: 路径 })保留当前页面&…...
【Elasticsearch】index:false
在 Elasticsearch 中,index 参数用于控制是否对某个字段建立索引。当设置 index: false 时,意味着该字段不会被编入倒排索引中,因此不能直接用于搜索查询。然而,这并不意味着该字段完全不可访问或没有其他用途。以下是关于 index:…...
新版IDEA创建数据库表
这是老版本的IDEA创建数据库表,下面可以自己勾选Not null(非空),Auto inc(自增长),Unique(唯一标识)和Primary key(主键) 这是新版的IDEA创建数据库表,Not null和Auto inc可以看得到,但Unique和Primary key…...
输入带空格的字符串,求单词个数
输入带空格的字符串,求单词个数 __ueooe_eui_sjje__ ---->3syue__jdjd____die_ ---->3shuue__dju__kk ---->3 #include <stdio.h> #include <string.h>// 自定义函数来判断字符是否为空白字符 int isSpace(char c) {return c || c \t || …...
C语言程序设计十大排序—希尔排序
文章目录 1.概念✅2.希尔排序🎈3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展…...
Excel制作合同到期自动提醒!
大家好,我是小鱼。 今天分享一下如何利用Excel制作合同到期提醒表,实现Excel表格自动计算合同到期日和天数,根据合同状态和到期天数自动填充颜色提醒,超实用。先看一下效果,已经到期的合同会自动被填充为红色…...
“AI质量评估系统:智能守护,让品质无忧
嘿,各位小伙伴们!今天咱们来聊聊一个在现代社会中越来越重要的角色——AI质量评估系统。你知道吗?在这个快速发展的时代,产品质量已经成为企业生存和发展的关键。而AI质量评估系统,就像是我们的智能守护神,…...
爬虫基础之爬取某基金网站+数据分析
声明: 本案例仅供学习参考使用,任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …...
使用 Aryn DocPrep、DocParse 和 Elasticsearch 向量数据库实现高质量 RAG
作者:来自 Elastic Hemant Malik 及 Jonathan Fritz 组织依靠自然语言查询从非结构化数据中获取见解,但要获得高质量的答案,首先要进行有效的数据准备。Aryn DocParse 和 DocPrep通过将复杂文档转换为结构化 JSON 或 markdown 来简化此过程&a…...
Couchbase UI: Server
在 Couchbase UI 中的 Server(服务器)标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍: 1. 节点列表 显示集群中所有节点的列表,每个节点的详细信息包括: 节点地址࿱…...
Web3.0时代的挑战与机遇:以开源2+1链动模式AI智能名片S2B2C商城小程序为例的深度探讨
摘要:Web3.0作为互联网的下一代形态,承载着去中心化、开放性和安全性的重要愿景。然而,其高门槛、用户体验差等问题阻碍了Web3.0的主流化进程。本文旨在深入探讨Web3.0面临的挑战,并提出利用开源21链动模式、AI智能名片及S2B2C商城…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
