Ubuntu 之Glade图形化设计器

演示环境说明:本机使用Windows 11 家庭版本搭载 Ubuntu 22.04.4 LTS 子系统,同时并安装Ubuntu桌面虚拟化软件XLaunch。

如果没有搭建好上述问题,请参考:windows11子系统Ubuntu 22.04.4子安装图形化界面

Glade是什么?

glade是一个RAD(rapid application develop,快速应用开发)工具,能够为gtk+工具包和gnome桌面环境快速而简单地开发用户界面。Glade中设计的用户界面保存为XML,通过使用GtkBuilder GTK +对象,应用程序可以根据需要动态加载这些界面。通过使用GtkBuilder,Glade XML文件可以用于多种编程语言,包括C,C ++,C#,Vala,Java,Perl,Python等。Glade是根据GNU GPL许可证发布的自由软件。

Ubuntu 快速搭建Glade 开发环境

#安装 devhelp GTK文档查看程序
sudo apt-get install devhelp#安装 gtk/glib 的API参考手册及其它帮助文档
sudo apt-get install libglib2.0-doc libgtk-3-doc#安装基于GTK的界面GTK是开发Gnome窗口的c/c++语言图形库
sudo apt-get install glade libgtk-3-dev

Ubuntu 运行Glade

1、打开Ubuntu 系统控制台,输入glade 命令,图形界面软件打开后如下截图所示。

Glade 项目实例

功能要求:设计一个简单的登入窗口页面。

原型设计:

第一步:创建UI项目文件夹

  1. 创建一个项目,点击图标
  2. 点击保存按钮
  3. 弹出一个对话框,创建项目文件夹,点击图标
  4. 在顶部名称栏中输入自定义的名称
  5. 点击右下角的保存按钮,项目创建完成

 第二步:设置用户登入界面窗口

1.在Glade中创建顶层窗口,如图

2.更改窗口ID

我们现在可以选择更改窗口ID。这是将在C代码中引用窗口的名称。在下图中,它从GtkWindow的默认名称更改为window_main。在Glade窗口右侧的“常规”窗格中进行更改。

3.更改默认窗口大小

可以选择更改窗口的默认大小。这将是由C程序创建时窗口的大小。如需自定义窗口大小,如下图,下图显示窗口大小已更改为640像素宽x 480像素高。

4.将回调函数连接到destroy 信号

当C程序显示当前在glade中设计的窗口时,当窗口关闭时,它将发出destroy 信号。回调函数需要连接到destroy 信号,关闭窗口时,将运行的destroy 信号。

如图,点击“信号”标签,向下滚动,找到GtkWidget ,点击展开项,向下滚动找到destroy。点击<Type here>标签,输入on,软件会给推荐的处理函数名称,选择如图所示的名称,按Enter键确认。

 5.更改窗口标题,如图提示操作,输入标题名称

6.保存glade文件,点击右上角按钮

第三步:设置登入界面窗口内元素

1、选择布局控件GtkBox(盒子/水平布局),设置4行并且间隔设置为10 元素。

2、在GtkBox(盒子/水平布局)第一行放置一个普通文本用来显示"标题 "

3、 在GtkBox(盒子/水平布局)第二行放置一个GtkGride(表格控件),设置一行两列

左边放置普通文本设置默认值为"username", 设置默认宽度和高度

右边设置输入文本框,设置ID 为"username", 设置输入框提示语, 设置默认宽度和高度。

4、请重复第三步,将普通文本显示默认值修改为"password",

将输入文本框的ID修完passwd

5、在GtkBox(盒子/水平布局)第四行放置一个GtkGride(表格控件),设置一行两列。

左边放置普通按钮设置标题为"login", 设置默认宽度和高度, 并设置点击响应事件(on_login_clicked)。

右边放置普通按钮设置标题为"cancel", 设置默认宽度和高度, 并设置点击响应事件(on_cancel_clicked)。

第四步:GTK 程序与Glade 图形化设计页面集成

第一步:创建gtk_demo30.c文件,使用​名为his_login.glade的XML文件创建你上面步骤设计的登入窗口。建议:将此文件保存到包含已创建的glade文件的同一目录或文件夹中。代码如下所示:

#include<stdio.h>
#include<gtk-3.0/gtk/gtk.h>static void on_login_clicked(GtkButton *button, gpointer user_data){GtkEntry *username = GTK_ENTRY(gtk_builder_get_object(GTK_BUILDER(user_data), "username"));GtkEntry *passwd = GTK_ENTRY(gtk_builder_get_object(GTK_BUILDER(user_data), "passwd"));const gchar *username_text = gtk_entry_get_text(username);const gchar *passwd_text = gtk_entry_get_text(passwd);printf("用户输入的用户名:%s, 密码:%s\n",username_text, passwd_text);printf("点击按钮触发\n");
} static void on_cancel_clicked(GtkButton *button, gpointer user_data){printf("取消按钮触发\n");
}int main(int argc, char *argv[]) {GtkBuilder *builder;GtkWidget *window;GtkWidget *login;GtkWidget *cancel;GtkWidget *username;GtkWidget *passwd;gtk_init(&argc, &argv); // gtk 初始化builder = gtk_builder_new();// 创建新的builder 对象gtk_builder_add_from_file(builder, "his_login.glade", NULL);// 组件实例化window = GTK_WIDGET(gtk_builder_get_object(builder,"window_main")); // gtk 窗口实例化login = GTK_WIDGET(gtk_builder_get_object(builder,"login")); //登入按钮实例化cancel = GTK_WIDGET(gtk_builder_get_object(builder,"cancel")); //取消按钮实例化username = GTK_WIDGET(gtk_builder_get_object(builder,"username")); //账户输入文本框passwd = GTK_WIDGET(gtk_builder_get_object(builder,"passwd")); //密码输入文本框//组件事件绑定                                 g_signal_connect (login, "clicked", G_CALLBACK (on_login_clicked), builder);g_signal_connect (cancel, "clicked", G_CALLBACK (on_cancel_clicked), builder);gtk_builder_connect_signals(builder, NULL);//g_object_unref(builder);gtk_widget_show(window); // 显示windows 窗口包含的所有gtk 组件gtk_main(); //gtk 主事件循环开启return 0;}

 总结

1、glade 声明ID和回调函数,必须在*c 文件中必须一一对应上.

2、glade 组件实例化是通过builder 构建器完成,不在是通过gtk 相关组件头文件调用实现。

编译代码,在编译代码之前,请确保已安装GTK+3开发库。在Ubuntu 命令窗口中输入编译命令:

gcc `pkg-config --cflags gtk+-3.0` -o gtk_demo30 gtk_demo30.c `pkg-config --libs gtk+-3.0`

 运行应用程序,输入./gtk_demo30,效果如下图:

Glade 项目运行中遇到的问题

第一:绘制完his_login.glade 文件,编写完gtk_demo30.c 执行完编译命令,执行./gtk_demo30 程序,窗口提示:

 Gtk-CRITICAL **: gtk_builder_get_object: assertion `GTK_IS_BUILDER (builder)' failed 

Google 一下,国外网友给出的解决办法:

以下是原文截图:

解决办法:

大致意思是:移除g_object_unref(G_OBJECT(builder))

原因:由于g_object_unref(G_OBJECT(builder)) 导致无法使用builder构建器访问其他的组件,因此需要被移除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

im即时通讯软件系统,私有化部署国产化信创适配安全可控

私有化部署IM即时通讯软件系统是许多企业为了确保数据安全、控制隐私保护、提升灵活性而考虑的重要选择之一。信创适配安全可控是企业在私有化部署IM即时通讯软件系统时需要关注的关键点。本文将探讨私有化部署IM即时通讯软件系统的意义、信创适配的重要性&#xff0c;以及如何…

使用Vercel 搭建自己的Dashy导航页

背景 Dashy 是一个开源的自托管导航页面配置服务&#xff0c;它具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。用户可以利用 Dashy 将自己常用的一些网站聚合起来&#xff0c;形成一个个性化的导航页面。 同类的竞品还有Heimdall, Flare 等。 可以通过Docker 等…

OneNote 作为恶意软件分发新渠道持续增长

目前&#xff0c;Office 文件已经默认禁用宏代码&#xff0c;攻击者开始转向利用其他微软的软件产品来进行恶意 Payload 投递。默认情况下&#xff0c;OneNote 应用也包含在 Office 2019 和 Microsoft 365 软件中&#xff0c;所以 OneNote 文件越来越受到攻击者的青睐。如果有人…

(南京观海微电子)——TFT LCD压合技术

TFT-LCD TFT-LCD open cell后段制程主要指的是将驱动IC和PCB压合至液晶板上&#xff0c;这个制程主要由三个步骤组成&#xff1a; 1.ACF (Anisotropic Conductive Film)的涂布。 在液晶板需要压合驱动IC的地方涂布ACF&#xff0c;ACF又称异方性导电胶膜&#xff0c;特点是上下…

IntelliJ IDEA 中显示或隐藏类中的方法

直接上图 左侧找到Project->右键->勾选Show Members即可显示 没有勾选的状态 勾选后的状态

模板初阶【C++】

文章目录 模板的作用模板的原理模板分为两大类——函数模板和类模板函数模板语法函数模板实例化模板函数的方式模板函数的类型转换既有函数模板又有已经实现的函数&#xff0c;会优先调用哪一个&#xff1f; 类模板语法模板类实例化对象模板类的模板参数可以有缺省值类模板中的…

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表&#xff0c;或者所有分区表的所有分区&#xff0c;以便执行进一步的操作&#xff0c;比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…

【计算机毕业设计】194高校学习助手微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Node.js实现短链接(ShortLink):shortid、epxress让URL更简单

文章目录 一、短链接介绍二、插件介绍1、epxress2、shortid 三、实现方案1、安装依赖&#xff1a;2、实现原理 四、示例代码五、测试生产短链接 一、短链接介绍 短链接是指仅包含一个网址的链接形式&#xff0c;通俗一些就是将一个很长很复杂的的网址变成一个简短易记的链接。…

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?! 1 背景概述 最近协助一个小兄弟排查了某作业使用 sqoop 采集 oracle 数据的失败问题&#xff0c;问题现象&#xff0c;问题原因和解决方法都挺直观&#xff0c;但在此过程中发现了一个有趣的 Oracle JDBC 驱…

Kylin系列:架构和高级功能详解

目录 一、Kylin的架构 1.1 总体架构概述 1.2 数据源 1.3 元数据存储 1.4 构建引擎 1.5 存储引擎 1.6 查询引擎 1.7 用户接口 二、Kylin的高级功能 2.1 多维立方体(Cube) 2.1.1 Cube的定义 2.1.2 Cube的构建 2.2 查询优化 2.3 数据模型和星型模式 2.3.1 数据模…

使用SPI驱动数码管

代码&#xff1a; 7-seg.c /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;改进的延时法实现半双工软件串口文件&#xff1a;7seg.c说明&#xff1a;SPI控制数码管驱动文件作者&#xff1a;邵子扬时间&#xff1a;2012年12月15日*/#include <avr/io.h>ex…

Ubuntu:解决github出现 Permission denied (publickey)的问题

因为使用的Ubuntu 长久没有使用&#xff0c;使用下载的时候突然报错&#xff0c;使用ssh key这种方式进行clone &#xff0c;pull github上面的项目&#xff0c;使用 git clone或者git pull origin master出现permission denied (publickey)&#xff0c;原因是因为ssh key过期失…

0 知识的补充

目录 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 矢量混合积 坐标系 直角坐标系 柱坐标系 球坐标系 ​​​​​​​ 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 ​​​​​​​ 矢量混合积 坐标系 直角坐标系 柱坐标系 ​​​​​​​ 球坐标系

高速缓存存储器(Chche)

为了解决CPU和主存之间速度不匹配的问题&#xff0c;计算机系统中引入了高速缓存&#xff08;Chche&#xff09;的概念。 基本想法&#xff1a;使用速度更快但容量更小、价格更高的SRAM制作一个缓冲存储器&#xff0c;用来存放经常用到的信息&#xff1b;这样一来&#xff0c;…

Chrome插件: Octotree让你GitHub代码浏览速度飙升

在GitHub上浏览和管理项目代码时&#xff0c;您是否曾为复杂的目录结构感到困惑&#xff1f;如果有一种工具能够让您轻松浏览项目的文件和目录&#xff0c;会不会大大提升您的工作效率&#xff1f;这正是Octotree浏览器插件所能做到的。 不过说实话&#xff0c;GitHub自带的代码…

HMI 的 UI 风格,超凡脱俗

HMI 的 UI 风格&#xff0c;超凡脱俗

ARM功耗管理软件之WFIWFE

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战

java中Object和json相互转换的方式

1.org中jackson转换json,springboot中内置jackson ObjectMapper onew ObjectMapper(); List<>listnew ArrayList(); String jonso.writeAsValueString(list); 2.alibaba中fastjson转换成json GetMapping("/test")public TbUser testHttpClient(){String url…

Day11 —— 大数据技术之Spark

Spark快速入门系列 Spark的概述什么是Spark&#xff1f;Spark的主要特点Spark的主要组件 Spark安装Spark三种运行模式Spark Standalone架构Spark Standalone的两种提交方式Spark On YARN架构 RDD算子转化算子行动算子 Spark RDDRDD的创建从对象集合创建RDD从外部存储创建RDD Sp…