Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)

八、ui窗体创建要点

.h文件定义(popwindowf.h), TEST_TYPE_WINDOW宏是要创建的窗口样式。

#pragma once
#include <gtk/gtk.h>
G_BEGIN_DECLS
#define TEST_TYPE_WINDOW (test_window_get_type())
G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WINDOW, GtkWindow)
G_END_DECLS

g_object_new时生产TEST_TYPE_WINDOW,后面的参数是窗口的属性。

    window = g_object_new (TEST_TYPE_WINDOW,"default-height", 550, "default-width", 800,"title", "Nice window!",NULL);

在ui文件里的名字叫  TestWindow ,如果是主窗体,则是项目的  工程名+Window ,如 WithcamblaWindow。 ui文件里的template class名字,要和.h文件中的名字一致。

  <template class="TestWindow" parent="GtkWindow"><property name="default-height">800</property><property name="default-width">1200</property>

.c文件中的名字也是一致的, TestWindow是产生的新窗体的 handle

struct _TestWindow
{GtkWindow  parent_instance;/* Template widgets */GtkHeaderBar        *header_bar;GtkLabel            *label1;GtkButton           *button1;GtkButton           *button2;GtkGrid             *grid1;
};G_DEFINE_TYPE (TestWindow, test_window, GTK_TYPE_WINDOW)

创建窗体时有两个接口,一是窗口作为一个class的初始化init,另一个是窗体本身的初始化init

static void
test_window_class_init (TestWindowClass *klass)
{GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);gtk_widget_class_set_template_from_resource (widget_class, "/org/mongnewer/test/popwindowf.ui");gtk_widget_class_bind_template_child (widget_class, TestWindow, header_bar);gtk_widget_class_bind_template_child (widget_class, TestWindow, label1);gtk_widget_class_bind_template_child (widget_class, TestWindow, button1);gtk_widget_class_bind_template_child (widget_class, TestWindow, button2);gtk_widget_class_bind_template_child (widget_class, TestWindow, grid1);
static void
test_window_init (TestWindow *self)
{gtk_widget_init_template (GTK_WIDGET (self));g_signal_connect(GTK_WINDOW(self), "destroy", G_CALLBACK(closewindow), self);
}

如果要创建一个叫Passwd窗体,则是PASSWD_TYPE_WINDOW(passwd_window_get_type()),

G_DECLARE_FINAL_TYPE (PasswdWindow, passwd_window, PASSWD, WINDOW, GtkWindow),ui文件中template class = PasswdWindow,如此,可以考贝已有的.h和.c,然后改动一个名称,注意保持.h .c ui间的名称一致。创建窗体时,用GtkWindow,或GtkApplicationWindow, 也是注意保持.h .c ui间窗体样式的一致性。

九、工程添加.c和ui文件

meson和make一样,在meson.build中要加入窗体的 .c, make时就一同make了

新窗体的ui文件要写到resource xml 配置中

写起来挺啰嗦,实现起来只是考贝、修改,名称不一致编译时也会有警告提示的。

十、其它注意事项

如果cambalache不能显示图形,关闭cambalache软件使用硬件加速功能,尤其是在虚拟中运行cambalache,因为没有加速的硬件,所以要关闭它,否则不能显示图形。cambalache是flatpak包,需要安装flatseal包,用flatseal关闭cambalache的硬件加速功能。

ubuntu 22.04 mate-desktop 运行gnome-builder遇到闪退问题的话,sudo apt install tasksel, 运行tasksel可选择不同的桌面。

选择gnome桌面可解决问题, 窗口管理器依然选用lightdm,不需要选用 gdm3 管理器。问题遇到了、处理掉,就写在这里吧。

GtkApplication简单化编程

gnome-builder构建器功能多,打包方便,但操作也相对繁琐,网上文档零散、不完整,其实,编程的话可以直接写代码,也可以直接写ui文件(gtk4更适合直接写ui),或是直接用代码创建窗体,这样的话编辑器用简单的geany就可以(可能开始时要辅以gtk4网页帮助),修改界面非常方便。

下面是一个习练的代码程序

geany 代码窗口

在geany下编译 gcc `pkg-config --cflags gtk4` -o "%e" "%f" `pkg-config --libs gtk4`,显示窗体。

下面是编写的代码

#include <gtk/gtk.h>void
closewindow(GtkWidget *window, gpointer user_data);void
newwindow(GtkWindow *window, gpointer user_data)
{GtkWindow *windownew = GTK_WINDOW(gtk_window_new());gtk_window_set_default_size(GTK_WINDOW(windownew), 400, 300);gtk_window_set_title(GTK_WINDOW(windownew), "child window");GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);gtk_box_set_homogeneous(GTK_BOX(box), TRUE);GtkWidget *button = gtk_button_new_with_label("new label");gtk_button_set_label(GTK_BUTTON(button), "new pushButton");g_signal_connect_swapped(GTK_BUTTON(button), "clicked", G_CALLBACK(&closewindow), windownew);g_signal_connect_swapped(GTK_WINDOW(windownew), "destroy", G_CALLBACK(&closewindow), windownew);GtkWidget *spacer1 = gtk_label_new("");GtkWidget *spacer2 = gtk_label_new("");gtk_box_append(GTK_BOX(box), spacer1);gtk_box_append(GTK_BOX(box), button);gtk_box_append(GTK_BOX(box), spacer2);gtk_window_set_child(GTK_WINDOW(windownew), box);gtk_window_set_transient_for(GTK_WINDOW(windownew), window);gtk_window_present(GTK_WINDOW(windownew));
}void
newwindow1(GtkWindow *window_in, gpointer user_data_in)
{GtkBuilder *builder = gtk_builder_new();gtk_builder_add_from_file (builder, "builder.ui", NULL);/* Connect signal handlers to the constructed widgets. */GObject *window = gtk_builder_get_object (builder, "window");gtk_window_set_default_size(GTK_WINDOW(window), 600, 350);GObject *button = gtk_builder_get_object (builder, "button1");g_signal_connect_swapped (button, "clicked", G_CALLBACK (closewindow), window);button = gtk_builder_get_object (builder, "button2");g_signal_connect_swapped (button, "clicked", G_CALLBACK (closewindow), window);button = gtk_builder_get_object (builder, "quit");g_signal_connect_swapped (button, "clicked", G_CALLBACK (closewindow), window);gtk_window_set_transient_for(GTK_WINDOW(window), window_in);gtk_widget_show (GTK_WIDGET (window));/* We do not need the builder any more */g_object_unref (builder);
}void
closewindow(GtkWidget *window, gpointer user_data)
{gtk_window_destroy(GTK_WINDOW(window));
}static void
activate (GtkApplication* app,gpointer        user_data)
{GtkWidget *window;window = gtk_application_window_new (app);gtk_window_set_title (GTK_WINDOW (window), "Parent Window");gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);gtk_box_set_homogeneous(GTK_BOX(box), TRUE);GtkWidget *button = gtk_button_new();GtkWidget *button1 = gtk_button_new();gtk_button_set_label(GTK_BUTTON(button), "pushButton");gtk_button_set_label(GTK_BUTTON(button1), "pushButton1");g_signal_connect_swapped(GTK_BUTTON(button), "clicked", G_CALLBACK(&newwindow), window);g_signal_connect_swapped(GTK_BUTTON(button1), "clicked", G_CALLBACK(&newwindow1), window);g_signal_connect_swapped(GTK_WINDOW(window), "destroy", G_CALLBACK(&closewindow), window);GtkWidget *spacer1 = gtk_label_new("");GtkWidget *spacer2 = gtk_label_new("");gtk_box_append(GTK_BOX(box), spacer1);gtk_box_append(GTK_BOX(box), button);gtk_box_append(GTK_BOX(box), button1);gtk_box_append(GTK_BOX(box), spacer2);gtk_window_set_child(GTK_WINDOW(window), box);gtk_widget_show (window);
}int
main (int    argc,char **argv)
{GtkApplication *app;int status;app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);status = g_application_run (G_APPLICATION (app), argc, argv);g_object_unref (app);return status;
}

下面是简单化的手写ui(复制、粘贴、修改)

<?xml version="1.0" encoding="UTF-8"?>
<interface><object id="window" class="GtkWindow"><property name="title">Grid</property><child><object id="grid" class="GtkGrid"><property name="column-homogeneous">True</property><property name="column-spacing">10</property><property name="hexpand">True</property><property name="hexpand-set">True</property><property name="row-homogeneous">True</property><property name="row-spacing">10</property><property name="vexpand">True</property><property name="vexpand-set">True</property><child><object id="spacer1" class="GtkLabel"><property name="label"></property><layout><property name="column">0</property><property name="column-span">4</property><property name="row">0</property></layout></object></child><child><object id="button1" class="GtkButton"><property name="label">Button 1</property><layout><property name="column">1</property><property name="row">1</property></layout></object></child><child><object id="button2" class="GtkButton"><property name="label">Button 2</property><layout><property name="column">2</property><property name="row">1</property></layout></object></child><child><object id="quit" class="GtkButton"><property name="label">Quit</property><layout><property name="column">1</property><property name="row">2</property><property name="column-span">2</property></layout></object></child><child><object id="spacer2" class="GtkLabel"><property name="label"></property><layout><property name="column">0</property><property name="column-span">4</property><property name="row">3</property></layout></object></child></object></child></object>
</interface>

ui写着不顺手时装到cambalache里完善一下再export出来接着手改完善,还是比较方便的。

新年到了,祝CSDN朋友们新春快乐、生活轻松幸福!

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

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

相关文章

c++之说_10|自定义类型 union 联合体

之前我们说了一些 struct 结构体 现在来了解新的自定义类型 union 联合体 语法 union ptr {void* fptr;CLassFunPtr p;FunPtr p2;ptr& operator(CLassFunPtr ptr){p ptr;return *this;}ptr& operator(FunPtr Fptr){p2 Fptr;return *this;} } FunPtr_; 我们看到了…

【Effective Objective - C 2.0】——读书笔记(二)

文章目录 前言六、理解“属性”这一概念七、在对象内部尽量直接访问实例变量八、理解“对象等同性”这一概念九、以“类族模式”隐藏实现细节十、在既有类中使用关联对象存放自定义数据十一、理解objc_msgSend的作用十二、理解消息转发机制动态方法解析备援接受者完整的消息转发…

Hive-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点 三、架构图1.UI交互层2.Driver驱动层3.Compiler4.Metastore5.Execution Engine 四、执行流程1.发起请求2.获取执行计划3.获取元数据4.返回元数据5.返回执行计划6.运行执行计划7.运行结果获取 五、数据模型1.DataBase数据库2.T…

Java并发基础:LinkedBlockingDeque全面解析!

内容概要 LinkedBlockingDeque提供了线程安全的双端队列实现&#xff0c;它支持在队列两端高效地进行插入和移除操作&#xff0c;同时具备阻塞功能&#xff0c;能够很好地协调生产者与消费者之间的速度差异&#xff0c;其内部基于链表结构&#xff0c;使得并发性能优异&#x…

【开源项目阅读】Java爬虫抓取豆瓣图书信息

原项目链接 Java爬虫抓取豆瓣图书信息 本地运行 运行过程 另建项目&#xff0c;把四个源代码文件拷贝到自己的包下面 在代码爆红处按ALTENTER自动导入maven依赖 直接运行Main.main方法&#xff0c;启动项目 运行结果 在本地磁盘上生成三个xml文件 其中的内容即位爬取…

Stable Diffusion 模型下载:RealCartoon-Realistic - V13

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 该检查点是 RealCartoon3D 检查点的一个分支。这个目标是在背景和人物中产生更“真实”的外观。我试图避免这个模型中更多的动漫、卡通和“完美”外观。这是一个肯

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

目录 排序的概念&#xff1a; 排序算法的实现&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 堆排序&#xff1a; 冒泡排序&#xff1a; 快速排序&#xff1a; 快速排序的基本框架&#xff1a; 1.Hoare法 2. 挖坑法 3.前后指针法 快…

优质项目追踪平台一览:助力项目管理与监控

项目追踪平台是现代项目管理中不可或缺的工具&#xff0c;它可以帮助团队高效地跟踪和管理项目进度、任务和资源分配。在当今快节奏的商业环境中&#xff0c;有许多热门的项目追踪平台可供选择。 本文总结了当下热门的项目追踪平台&#xff0c;供您参考~ 1、Zoho Projects&…

【Vue】Vue基础入门

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳重求进&#xff0c;晒太阳 Vue概念 是一个用于构建用户界面的渐进式框架优点&#xff1a;大大提高开发效率缺点&#xff1a;需要理解记忆规则 创建Vue实例 步骤&#xff1a; …

SpringBoot-基础篇03

之前搭建了整个开发环境实现了登录注册&#xff0c;springBoot整合mybatis完成增删改查&#xff0c;今天完成分页查询&#xff0c;使用阿里云oss存储照片等资源&#xff0c;后期会尝试自己搭建分布式文件系统来实现。 一&#xff0c;SpringBootMybatis完成分页查询 1&#xff…

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…

【Linux】构建模块

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f94a;不要让自己再留有遗憾&#xff0c;加油吧&#xff01; 文章目录 构建第一个模块1模块的makefile2内核树内构建3内核树外构建 构建第一个模块 可以在两个地方构建模…

【Spring】Spring 对 Ioc 的实现

一、Ioc 控制反转 控制反转是一种思想 控制反转是为了降低程序耦合度&#xff0c;提高程序扩展力&#xff0c;达到 OCP 原则&#xff0c;达到 DIP 原则 控制反转&#xff0c;反转的是什么&#xff1f; 将对象的创建权利交出去&#xff0c;交给第三方容器负责 将对象和对象之…

Windows下搭建Redis Sentinel

下载安装程序 下载Redis关于Windows安装程序&#xff0c;下载地址 下载成功后进行解压&#xff0c;解压如下&#xff1a; 配置redis和sentinel 首先复制三份redis.windows.conf&#xff0c;分别命名为&#xff1a;redis.6379.conf、redis.6380.conf、redis.6381.conf&…

C++笔记之regex(正则表达式)

C++笔记之regex(正则表达式) ——2024-02-10 ——《C++标准库》(第2版,侯捷译) Page 717 code review! 文章目录 C++笔记之regex(正则表达式)例1:使用正则表达式进行搜索(`std::regex_search`)例2:使用正则表达式进行全文匹配(`std::regex_match`)例3:使用正则表达式…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…

分享3款开源免费好用的Docker可视化管理工具安装部署教程

文章目录 1.前言2.Docker Desktop3.Portainer3.1 Portainer默认英文版本安装3.2 Portainer汉化版本安装3.3官方镜像说明3.3.1ssl访问3.3.2Nginx反代3.3.3Nginx反代设置子目录3.3.4docker-compose部署 3.4登录 4.DockerUI4.1简介4.2项目地址4.3部署启动命令4.4登录4.5首页 5.总结…

vue day06

1、路由模块封装 2、声明式导航 实现导航高亮效果 直接通过这两个类名对相应标签设置样式 点击a链接进入my页面时&#xff0c;a链接 我的音乐高亮&#xff0c;同时my下的a、b页面中的 我的音乐也有router-link-active类&#xff0c;但没有精确匹配的类&#xff08;只有my页…

Android 粒子喷泉动效

一、前言&#xff1a; 在学习open gl es实现动效的时候&#xff0c;打算回顾了一下用普通的2D坐标系实现粒子效果和 open gl 3d 坐标系的区别&#xff0c;以及难易程度&#xff0c;因此本篇以Canvas 2D坐标系实现了一个简单的demo。 粒子动效原理&#xff1a; 粒子动效本质上…

读完《王志纲谈生涯规划》后感

(点击即可收听) 经常在短视频刷到,这位王志钢老师,在微信读书里面也看到过,于是拜读了一下,这是一本生涯规划书,但更多的是他个人经历的一个描述 有大道理&#xff0c;有些话还是值得认可的 比如&#xff1a;他谈到,想要减少个人乃至社会的悲剧&#xff0c;最好的办法就是尽自己…