Ubuntu 之Glade图形化设计器

news2024/11/20 12:38:32

演示环境说明:本机使用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.coloradmin.cn/o/1855276.html

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

相关文章

驾校预约管理系统

摘 要 随着驾驶技术的普及和交通安全意识的增强&#xff0c;越来越多的人选择参加驾校培训&#xff0c;以获取驾驶执照。然而&#xff0c;驾校管理面临着日益增长的学员数量和繁琐的预约管理工作。为了提高驾校的管理效率和服务质量&#xff0c;驾校预约管理系统成为了必不可少…

[spring] Spring MVC - CRUD 操作

[spring] Spring MVC - CRUD 操作 基础实现源自于这两篇笔记&#xff1a; [spring] Spring Boot REST API - 项目实现[spring] Spring Boot REST API - CRUD 操作 除了 Rest API 部分改成了 Controller 之外&#xff0c;其他没什么变化&#xff0c;还是使用 service --> …

6/23 第四周 python操作excel

excel对于python来说就是一个二维数组&#xff0c;只是多了一个多sheet的index的索引&#xff0c;在确定索引之后&#xff0c;不管是读取还是写入&#xff0c;都是类似于二维数组。对于数据的处理&#xff0c;读取和写入就够了&#xff0c;如果要应用图表&#xff0c;个人觉得还…

nest.js关键笔记

Nest.js 介绍核心功能设计模式&#xff1a;IOC 控制反转 DI 依赖注入前置知识&#xff1a;装饰器前置知识装饰器-实现一个GET请求 Nestjs脚手架Nestjs cli 常用命令 RESTful 风格设计Nestjs 控制器控制器中常见的参数装饰器 Session 实例Nestjs 提供者**工厂模式**异步模式 Nes…

Linux 7种 进程间通信方式

传统进程间通信 通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B&#xff08;B不知道A什么时候把内容传到硬盘中&#xff09; 1.无名管道 2.有名管道 3.信号 IPC进程间通信 4.消息队列 5.共享内存 6.信号灯集 7.socket通信 一、无名管道&a…

《书生·浦语大模型实战营》第5课 学习笔记:LMDeploy 量化部署 LLM 实践

文章大纲 0.背景知识与简介计算机组成原理&#xff1a;变量的存储参数量与推理的关系 1.LMDeploy环境部署1.1 创建开发机1.2 创建conda环境InternStudio开发机创建conda环境&#xff08;推荐&#xff09;本地环境创建conda环境 1.3 安装LMDeploy 2.LMDeploy模型对话(chat)2.1 H…

Golang | Leetcode Golang题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

期货交易纪律2024年6月22号

文章目录 期货交易系统构建第一步、选品第二步、开仓纪律第三步、持仓 2024年6月22号&#xff0c;开始写期货交易的第三篇日记。 交易记录&#xff1a;市场继续震荡&#xff0c;这两天无交易&#xff0c;继续梳理一些期货交易选品&#xff0c;周末详细的了解了一下豆粕&#xf…

axure制作菜单下拉、隐藏、点击选中效果

在高保真原型中&#xff0c;制作导航栏菜单时&#xff0c;需要达到点击下拉按钮&#xff0c;子菜单自动弹出&#xff0c;点击其中一个子菜单项可栏目变为选中状态且跳转到对应的子页面。制作材料可以从antdesign中去下载&#xff0c;以下述网络配置菜单为例。在箭头处添加互动效…

Pytest和Unitest框架对比

在学到自动化的时候,很多同学都遇到了Pytest和Unitest框架,有的人是两个都学,但是学的不精只是知道分别怎么用.不了解两个区别是什么.有的是犹豫到底要学习那个框架.其实要做好自动化测试,是有必要了解不同框架之间的差异化的. Pytest 特点: Pytest采用了更简洁、更灵活的语法…

C语言 | Leetcode C语言题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; #define MAXSIZE 769/* 选取一个质数即可 */ typedef struct Node {char string[101];int index;struct Node *next; //保存链表表头 } List;typedef struct {List *hashHead[MAXSIZE];//定义哈希数组的大小 } MyHashMap;List * …

【建设方案】大数据湖一体化建设方案(ppt原件)

1、背景&#xff1a;大数据湖的发展背景与建设理念 2、体系&#xff1a;大数据湖体系规划与建设思路 3、生态圈&#xff1a;探索新兴业务入湖建设模式 4、共享&#xff1a;大数据湖统一访问共享规划 5、运营&#xff1a;大数据湖一体化运营管理建设 &#xff08;本方案及更多方…

交通大数据分析与挖掘实训【对提供的CSV格式数据使用pandas库分析-Matplotlib库绘图】

背景&#xff1a; 《交通大数据分析与挖掘》实训 指 导 书 编著 二○二四年五月 一、实训目的 1、掌握python开发环境&#xff08;如Anaconda&#xff09;及Numpy等常见第三方库的使用&#xff1b; 2、熟悉Anaconda在线编程平台&#xff0c;学会基本的python程序编写…

CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中

CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中 code review! 文章目录 CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中1.CMAKE_INSTALL_PREFIX详解变量作用设置 CMAKE_INSTALL_PREFIX示例影响范围常见用法特别…

OpenHarmony 应用开发FullSDK获取与替换

DevEco Studio是OpenHarmony应用集成开发环境。public-SDK是提供给应用开发的工具包&#xff0c;跟随DevEco Studio下载&#xff0c;不包含系统应用所需要的高权限API。full-SDK是提供给OEM厂商开发应用的工具包&#xff0c;不能随DevEco Studio下载&#xff0c;包含了系统应用…

了解请求参数与响应参数的区别:初学者指南

在 Web 的开发领域&#xff0c;无论你是前端开发还是后端开发人员&#xff0c;把握请求与响应参数的核心差异是极其重要的。这些参数在客户端和服务器之间的互动中扮演着关键角色。 请求参数的定义及类别 定义 当客户端向服务器提交信息时所使用的数据被称为请求参数。这些参…

Fine-tuning在垂直领域的最佳实践指南

对于Fine-tuning是深度学习和机器学习领域一个特别重要的概念&#xff0c;并且每个企业的实践方式也会有所不同&#xff0c;今天我们就来聊一聊Fine-tuning。 什么是Fine-tuning Fine-tuning指的是模型微调&#xff0c;通常是指在一个预训练模型的基础上&#xff0c;通过在特…

【剖析】为什么说RBF神经网络的误差为0

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 机器学习中的模型非常的多&#xff0c;但如果要问有没有这样的一个模型&#xff0c;它的训练误差为0&#xff0c;那么就非RBF神经网络莫属了&#xff01;下面我们来聊聊&#xff0c;为什么RBF神经网络的训练误差为0。…

Springboot多模块项目从0构建打包运行

今天复习了一下Springboot的多模块的构建&#xff0c;其实一直以来都对单体项目使用多模块感到不太理解&#xff0c;不知道到底有什么样的优势&#xff0c;目前切身体会到的优势就是确实可以让依赖的划分更加清晰&#xff08;每个模块下的pom文件只引入该模块需要的依赖&#x…