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

2024-02-10 11:12

本文主要是介绍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朋友们新春快乐、生活轻松幸福!

这篇关于Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696960

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个