第115页的gtk+编程例子——进度条改写网上的例子用gtk4编译

发布时间:2026/8/26 10:46:21

第115页的gtk+编程例子——进度条改写网上的例子用gtk4编译
第115页的gtk编程例子——进度条改写网上的例子用gtk4编译主要是参考网络《GTK 2.0 中文教程》中进度条 Progress Bars的例子程序源代码出处是http://www.huzheng.org/ebook/gtk2-tut/x892.html第115页的gtk编程例子——最简单的进度条2附带使用Anjuta写gtk程序的步骤https://blog.csdn.net/weixin_42145772/article/details/125022694在openSUSE-Leap-15.6-DVD-x86_64的gnome45.3桌面环境下编译的其中pkg-config --cflags gtk4两边有反引号括起来的ruhongvnclocalhost:~/gtk4 gcc -g -Wallpkg-config --cflags gtk4page1154.cpkg-config --libs gtk4-o page1154#includestdlib.h#includegtk/gtk.hstaticinttime_interval500;/* 定义全局变量time_interval并设定初始值为500 */staticgdouble increment0.1;staticGtkWidget*entry1;staticvoidslow(void){time_interval800;/* 改变全局变量time_interval的值为800 */}staticvoidmiddle(void){time_interval500;}staticvoidquick(void){time_interval200;}staticvoidcustom(void){constchar*text;GtkEntryBuffer*buffer;char*endptrNULL;buffergtk_entry_get_buffer(GTK_ENTRY(entry1));textgtk_entry_buffer_get_text(buffer);/* 获取用户在输入框entry1输入的数字内容例如0.08此时的数字内容是字符类型 */incrementstrtod(text,endptr);/* 字符类型的数字0.08是字符类型转换为浮点数字0.08 */}staticgbooleanfill1(gpointer user_data){GtkWidget*progress_bar1user_data;/* 获取当前进度条的值 */gdouble fraction1;fraction1gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar1));/* 每次调用此函数时将进度条增加10%标准写法是fraction fraction 0.1 缩写为 0.1*/fraction1increment;/* 根据fraction的值设定进度条显示的长度 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);/* 确保进度条的值保持在1.0以下*/if(fraction11.0)returnTRUE;returnFALSE;}staticgbooleanfill2(gpointer user_data){GtkWidget*progress_bar2user_data;/* 获取当前进度条的值 */gdouble fraction2;fraction2gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar2));/* 每次调用此函数时将进度条增加10%标准写法是fraction fraction 0.1 缩写为 0.1*/fraction20.1;/* 确保进度条的值保持在1.0以下让它无限循环*/if(fraction21.0)fraction20.0;/* 根据fraction的值设定进度条显示的长度 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar2),fraction2);/* 返回 TRUE,这样它就能够继续被调用 */returnTRUE;}staticvoidbegin(GtkWidget*widget,gpointer user_data){GtkWidget*progress_bar1user_data;gdouble fraction10.0;gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);g_timeout_add(time_interval,fill1,GTK_PROGRESS_BAR(progress_bar1));g_print(time_interval is: %d\n,time_interval);//用来调试程序在命令行下观察time_interval的值变化g_print(increment is: %f\n,increment);//用来调试程序在命令行下观察increment的值变化}staticvoidtoggle_orientation(GtkWidget*widget,gpointer user_data){GtkWidget*progress_bar2user_data;switch(gtk_progress_bar_get_inverted(GTK_PROGRESS_BAR(progress_bar2))){caseFALSE:gtk_progress_bar_set_inverted(GTK_PROGRESS_BAR(progress_bar2),TRUE);break;caseTRUE:gtk_progress_bar_set_inverted(GTK_PROGRESS_BAR(progress_bar2),FALSE);break;default:;// 什么也不做}}staticvoidactivate(GtkApplication*app,gpointer user_data){GtkWidget*window;GtkWidget*grid;GtkWidget*check1,*check2,*check3,*check4,*check5;GtkWidget*progress_bar1;GtkWidget*button1;//GtkWidget *hseparator;GtkWidget*label1,*label2,*label3;GtkWidget*progress_bar2;gdouble fraction10.0;gdouble fraction20.5;/* 创建具有标题和默认大小的窗口 */windowgtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window),ProgressBar Example);gtk_window_set_default_size(GTK_WINDOW(window),500,200);gridgtk_grid_new();gtk_window_set_child(GTK_WINDOW(window),grid);gtk_widget_set_halign(grid,GTK_ALIGN_CENTER);gtk_widget_set_valign(grid,GTK_ALIGN_CENTER);/* 设置grid表格水平居中垂直居中 */check1gtk_check_button_new_with_label(慢);gtk_grid_attach(GTK_GRID(grid),check1,0,0,1,1);g_signal_connect(G_OBJECT(check1),toggled,G_CALLBACK(slow),NULL);check2gtk_check_button_new_with_label(中);gtk_check_button_set_group(GTK_CHECK_BUTTON(check2),GTK_CHECK_BUTTON(check1));/* 将三个按钮联系在一起实现三个中只能选择其中一个有效 */gtk_check_button_set_active(GTK_CHECK_BUTTON(check2),TRUE);gtk_grid_attach(GTK_GRID(grid),check2,1,0,1,1);g_signal_connect(G_OBJECT(check2),toggled,G_CALLBACK(middle),NULL);check3gtk_check_button_new_with_label(快);gtk_check_button_set_group(GTK_CHECK_BUTTON(check3),GTK_CHECK_BUTTON(check1));gtk_grid_attach(GTK_GRID(grid),check3,2,0,1,1);g_signal_connect(G_OBJECT(check3),toggled,G_CALLBACK(quick),NULL);check4gtk_check_button_new_with_label(自定义);gtk_grid_attach(GTK_GRID(grid),check4,3,0,1,1);g_signal_connect(G_OBJECT(check4),toggled,G_CALLBACK(custom),NULL);entry1gtk_entry_new();gtk_entry_set_placeholder_text(GTK_ENTRY(entry1),0.01-0.30);/* 在输入框中提示输入的数字范围 */gtk_entry_set_input_purpose(GTK_ENTRY(entry1),GTK_INPUT_PURPOSE_NUMBER);/* 在输入框中限制只能输入数字和小数点 */gtk_grid_attach(GTK_GRID(grid),entry1,4,0,1,1);label1gtk_label_new(先选择慢中快先输入数字再勾选自定义再点击开始);//First select slow, medium, or fast, then enter the number and check the custom option before clicking startgtk_grid_attach(GTK_GRID(grid),label1,0,1,4,1);/* 创建进度条并将其添加到窗口 */progress_bar1gtk_progress_bar_new();gtk_grid_attach(GTK_GRID(grid),progress_bar1,0,2,4,1);gtk_widget_set_valign(progress_bar1,GTK_ALIGN_CENTER);/* 设置进度条垂直居中 *//* 根据fraction的值设定进度条显示的长度进度条的值必须介于0.0-1.0含0.0-1.0之间*/gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);/* 每隔500毫秒运行一次fill函数 */g_timeout_add(500,fill1,GTK_PROGRESS_BAR(progress_bar1));button1gtk_button_new_with_label(开始);gtk_grid_attach(GTK_GRID(grid),button1,4,2,1,1);g_signal_connect(G_OBJECT(button1),clicked,G_CALLBACK(begin),progress_bar1);//hseparator gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);//gtk_grid_attach (GTK_GRID (grid), hseparator, 0, 1, 4, 1);label2gtk_label_new(——————分隔线——————);gtk_grid_attach(GTK_GRID(grid),label2,0,3,4,1);label3gtk_label_new(无限循环);//infinite loopgtk_grid_attach(GTK_GRID(grid),label3,0,4,4,1);progress_bar2gtk_progress_bar_new();gtk_grid_attach(GTK_GRID(grid),progress_bar2,0,5,4,1);gtk_widget_set_valign(progress_bar2,GTK_ALIGN_CENTER);/* 设置进度条垂直居中 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar2),fraction2);g_timeout_add(300,fill2,GTK_PROGRESS_BAR(progress_bar2));check5gtk_check_button_new_with_label(反方向);//opposite directiongtk_grid_attach(GTK_GRID(grid),check5,4,5,1,1);g_signal_connect(G_OBJECT(check5),toggled,G_CALLBACK(toggle_orientation),progress_bar2);gtk_window_present(GTK_WINDOW(window));}intmain(intargc,char**argv){GtkApplication*app;intstatus;appgtk_application_new(org.gtk.example,G_APPLICATION_DEFAULT_FLAGS);g_signal_connect(app,activate,G_CALLBACK(activate),NULL);statusg_application_run(G_APPLICATION(app),argc,argv);g_object_unref(app);returnstatus;}效果图如下

相关新闻

如何用DevToysMac提升macOS开发效率:完整的全能工具箱指南

如何用DevToysMac提升macOS开发效率:完整的全能工具箱指南

2026/8/22 17:41:33

如何用DevToysMac提升macOS开发效率:完整的全能工具箱指南 【免费下载链接】DevToysMac DevToys For mac 项目地址: https://gitcode.com/gh_mirrors/de/DevToysMac 你是否厌倦了在多个工具之间来回切换,只为完成一些看似简单却频繁出现的开发任务…

4-20mA电流环原理与INA196工业级接收器设计

4-20mA电流环原理与INA196工业级接收器设计

2026/8/23 12:01:34

1. 4-20mA电流环基础与行业应用在工业自动化领域,4-20mA电流环传输标准已经存在超过60年,至今仍是过程控制系统中模拟信号传输的黄金标准。这种双线制传输方式之所以经久不衰,主要得益于其独特的物理特性:电流信号在长距离传输时不…

如何精准识别区域内的技术短板与创新潜力?

如何精准识别区域内的技术短板与创新潜力?

2026/8/26 19:46:29

观点作者:科易网-国家科技成果转化(厦门)示范基地 核心要点 精准识别区域技术短板需构建全域科创知识图谱,以数智化工具实现资源底数清、需求精准挖、对接高效达、成果价值显。高校院所需通过知识图谱与技术评估工具盘活“沉睡”成…

基于HyperMesh的汽车内外饰件快速建模工作流解析

基于HyperMesh的汽车内外饰件快速建模工作流解析

2026/8/27 0:07:12

很多做汽车内外饰件分析的工程师,第一次接触仪表板、门护板、副仪表板这类零件时,都会被同一个问题卡住:零件本身不大,但圆角、卡扣、加强筋、工艺孔、弱化线这些几何特征极其密集,翻遍HyperMesh 的 Geom 面板忙活半天…

MATLAB多选题数据分析:稀疏矩阵实战指南

MATLAB多选题数据分析:稀疏矩阵实战指南

2026/8/27 0:07:12

1. 这不是MATLAB语法课,而是一场多选题数据的实战解剖 你手头有一份问卷,327份有效回收,每道多选题允许勾选1–5个选项,原始数据在Excel里是“选项A,选项C,选项E”这样的字符串;你试过用Excel的文本分列COUNTIF&#x…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

绝缘子缺陷检测数据集实战:VOC+YOLO双格式训练全流程

绝缘子缺陷检测数据集实战:VOC+YOLO双格式训练全流程

2026/8/26 23:57:11

简介:目标检测模型的性能高度依赖训练数据的质量与格式,而在电力巡检领域,绝缘子缺陷检测更是面临小目标、复杂背景和样本稀缺等多重挑战。VOC与YOLO作为两种主流标注格式,分别以XML和归一化TXT形式存储边界框信息,是算…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…