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商城…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
