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

gnome-builder创建的程序,在工程树中有三个重要程序:main主程序、application应用程序和window主窗口程序。main整个程序的起始,它会操作application生产应用环境,application会操作window生成主窗口,于是就有了 application 和 window 的 handle,驾驭整个程序的运行。

新的主窗口生成,主要改动 withcambla-window.c 的内容,其它的暂时先不用动。

1- 改动窗体结构,将用到的widget全部放入窗体结构中(初创时只有个label)。

struct _WithcamblaWindow
{GtkApplicationWindow  parent_instance;/* Template widgets */GtkHeaderBar        *header_bar;GtkLabel            *label1;GtkButton           *button1;GtkButton           *button2;GtkButton           *button3;GtkGrid             *grid1;
};

2- 将widget绑定到template上

static void
withcambla_window_class_init (WithcamblaWindowClass *klass)
{GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);gtk_widget_class_set_template_from_resource (widget_class, "/org/mongnewer/test/withcambla-window.ui");gtk_widget_class_bind_template_child (widget_class, WithcamblaWindow, header_bar);gtk_widget_class_bind_template_child (widget_class, WithcamblaWindow, label1);gtk_widget_class_bind_template_child (widget_class, WithcamblaWindow, button1);gtk_widget_class_bind_template_child (widget_class, WithcamblaWindow, button2);gtk_widget_class_bind_template_child (widget_class, WithcamblaWindow, button3);gtk_widget_class_bind_template_child (widget_class, WithcamblaWindow, grid1);
}

3- 在窗口初始化中加入widget控制信号,建立起widget事件关系。

static void
withcambla_window_init (WithcamblaWindow *self)
{gtk_widget_init_template (GTK_WIDGET (self));g_signal_connect(GTK_BUTTON(self->button1), "clicked", G_CALLBACK(on_button1_click), self);g_signal_connect(GTK_BUTTON(self->button2), "clicked", G_CALLBACK(on_button2_click), self);g_signal_connect(GTK_BUTTON(self->button3), "clicked", G_CALLBACK(on_button3_click), self);
}

至此,主窗口程序就改动好了。

button1_click回调函数,在label上显示 hello 字样,因主使用markup, 不需要 pango 了。

static void
on_button1_click(GtkWidget *widget, WithcamblaWindow *self)
{gtk_label_set_markup (GTK_LABEL(self->label1),"<span foreground='red' underline='single' underline_color='blue' font_desc='Times italic 48'>Hello!</span>");GtkWidget *inlabel = gtk_button_get_child(GTK_BUTTON(self->button1));gtk_label_set_markup (GTK_LABEL(inlabel),"<span foreground='red' underline='single' underline_color='blue' font_desc='Times italic 48'>Hello!</span>");
}

button2_click回调函数,用程序方式直接写出一个窗体并作为主窗体的子窗体显示。

static void
on_button2_click(GtkWidget *widget, GtkWindow *self)
{GtkWidget *window = gtk_window_new ();gtk_window_set_default_size (GTK_WINDOW(window), 600, 400);gtk_window_set_title (GTK_WINDOW(window), "A popup window by button_click");GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);gtk_box_set_homogeneous (GTK_BOX(box), TRUE);gtk_window_set_child (GTK_WINDOW(window), GTK_WIDGET(box));GtkWidget *button = gtk_button_new_with_label("Pressed!");gtk_widget_set_visible (GTK_WIDGET(button), TRUE);g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(closewindow), window);g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(closewindow), window);GtkWidget *spacer1 = gtk_label_new("");gtk_box_append (GTK_BOX(box), GTK_WIDGET(spacer1));gtk_box_append (GTK_BOX(box), GTK_WIDGET(button));GtkWidget *spacer2 = gtk_label_new("");gtk_box_append (GTK_BOX(box), GTK_WIDGET(spacer2));gtk_window_set_resizable (GTK_WINDOW(window), FALSE);gtk_window_set_modal (GTK_WINDOW(window), TRUE);gtk_window_set_transient_for (GTK_WINDOW(window), GTK_WINDOW(self));gtk_widget_set_visible(window, TRUE);
}

button3_click回调函数,产生一个TEST_TYPE_WINDOW定义的子窗口并作为主窗口的子窗口显示。它不是由程序代码实现的,而是由 ui 文件实现的,需要另外的popwindowf.h和popwindowf.c实现。如果只是简单窗口,这种方式比直接代码实现窗口显得啰嗦一些。

static void
on_button3_click(GtkWidget *widget, GtkWindow *self)
{GtkWindow *window;window = g_object_new (TEST_TYPE_WINDOW,"default-height", 550, "default-width", 800,"title", "Nice window!",NULL);gtk_window_set_transient_for (window, self);gtk_window_present (window);
}

代码实现的子窗口

ui实现的子窗口(直接改了一下主窗口的ui,它们看上去很相似)

七、用菜单命令操作实现上述两个子窗口

菜单项操作与button信号操作有些不同,首先在主窗口的ui中加上新的菜单项。app.ghello, app.popwin1, app.popwin2

  <menu id="primary_menu"><section><item><attribute name="action">app.preferences</attribute><attribute name="label" translatable="yes">_Preferences</attribute></item><item><attribute name="action">win.show-help-overlay</attribute><attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute></item><item><attribute name="action">app.about</attribute><attribute name="label" translatable="yes">_About gnomeapp</attribute></item><item><attribute name="action">app.ghello</attribute><attribute name="label" translatable="yes">_gPrint Hello</attribute></item><item><attribute name="action">app.popwin</attribute><attribute name="label" translatable="yes">_popup window</attribute></item><item><attribute name="action">app.popwin1</attribute><attribute name="label" translatable="yes">_popup window 1</attribute></item><item><attribute name="action">app.popwin2</attribute><attribute name="label" translatable="yes">_popup window 2</attribute></item></section></menu>

菜单项的操作是withcambla-application.c初始化时关联的,它们都要挂到action map上去,然后与回调函数建立联系,快捷键也是在这个地方关联的。

static void
withcambla_application_init (WithcamblaApplication *self)
{g_autoptr (GSimpleAction) quit_action = g_simple_action_new ("quit", NULL);g_signal_connect_swapped (quit_action, "activate", G_CALLBACK (g_application_quit), self);g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (quit_action));g_autoptr (GSimpleAction) about_action = g_simple_action_new ("about", NULL);g_signal_connect (about_action, "activate", G_CALLBACK (withcambla_application_show_about), self);g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (about_action));g_autoptr (GSimpleAction) ghello_action = g_simple_action_new ("ghello", NULL);g_signal_connect (ghello_action, "activate", G_CALLBACK (ghello), self);g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (ghello_action));g_autoptr (GSimpleAction) popwin_action = g_simple_action_new ("popwin", NULL);g_signal_connect (popwin_action, "activate", G_CALLBACK (popwin), self);g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (popwin_action));g_autoptr (GSimpleAction) popwin1_action = g_simple_action_new ("popwin1", NULL);g_signal_connect (popwin1_action, "activate", G_CALLBACK (popwin1), self);g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (popwin1_action));g_autoptr (GSimpleAction) popwin2_action = g_simple_action_new ("popwin2", NULL);g_signal_connect (popwin2_action, "activate", G_CALLBACK (popwin2), self);g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (popwin2_action));gtk_application_set_accels_for_action (GTK_APPLICATION (self),"app.ghello",(const char *[]) {"<Control><Super><Alt>h",NULL,});gtk_application_set_accels_for_action (GTK_APPLICATION (self),"app.quit",(const char *[]) {"<primary>q",NULL,});
}

popwin回调函数,用代码创建子窗体,可以用button创建的好个,习练时也可以考贝一个改一下用。

static void
popwin(GSimpleAction *action,GVariant     *parameter,gpointer      user_data)
{WithcamblaApplication *self = WITHCAMBLA_APPLICATION (user_data);GtkWindow *windowapp = gtk_application_get_active_window (GTK_APPLICATION (self));GtkWidget *window = gtk_window_new ();gtk_window_set_default_size (GTK_WINDOW(window), 600, 400);gtk_window_set_title (GTK_WINDOW(window), "A popup window called from Menu");//gtk_window_set_application (GTK_WINDOW(window), GTK_APPLICATION (self));GtkWidget *box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);gtk_box_set_homogeneous (GTK_BOX(box), TRUE);gtk_window_set_child (GTK_WINDOW(window), GTK_WIDGET(box));GtkWidget *button = gtk_button_new_with_label("A new button");gtk_widget_set_visible (GTK_WIDGET(button), TRUE);g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(closewindow), window);g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(closewindow), window);GtkWidget *spacer1 = gtk_label_new("");gtk_box_append (GTK_BOX(box), GTK_WIDGET(spacer1));gtk_box_append (GTK_BOX(box), GTK_WIDGET(button));GtkWidget *spacer2 = gtk_label_new("");gtk_box_append (GTK_BOX(box), GTK_WIDGET(spacer2));gtk_window_set_resizable (GTK_WINDOW(window), FALSE);gtk_window_set_modal (GTK_WINDOW(window), TRUE);gtk_window_set_transient_for (GTK_WINDOW(window), GTK_WINDOW(windowapp));gtk_widget_set_visible(window, TRUE);
}

popwin1回调函数是通过测试调用一个子过程,由子过程代码创建的子窗口。

static void
popwin1(GSimpleAction *action,GVariant     *parameter,gpointer      user_data)
{WithcamblaApplication *self = WITHCAMBLA_APPLICATION (user_data);GtkWindow *windowapp = gtk_application_get_active_window (GTK_APPLICATION (self));popwinsub(NULL, windowapp);
}

popwin2回调函数,是调用popwindowf.h和popwindowf.c程序实现的。

static void
popwin2(GSimpleAction *action,GVariant      *parameter,gpointer       user_data)
{WithcamblaApplication *self = WITHCAMBLA_APPLICATION (user_data);GtkWindow *windowapp = gtk_application_get_active_window (GTK_APPLICATION (self));//popwinsubf(NULL, windowapp);/* Get the current window or create one if necessary. */GtkWindow *window;window = g_object_new (TEST_TYPE_WINDOW,"default-height", 550, "default-width", 800,"title", "Nice window!",NULL);gtk_window_set_transient_for (window, windowapp);/* Ask the window manager/compositor to present the window. */gtk_window_present (window);
}

还有些内容写在下篇笔记中

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

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

相关文章

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

AOP相关

AOP相关 什么是AOP&#xff1f; 常见的场景 记录操作日志 缓存处理 spring内置事务处理 AOP记录操作日志 定义切点表达式&#xff0c;确定要记录的方法 找到方法中有log注解的方法 获得方法 获得方法的参数 spring中的事务实现 spring中的事务分声明式事务和编程式事务…

巴菲特经典演讲:这些人只关注两个数字,便取得了成就

1984年&#xff0c;为纪念格雷厄姆&#xff08;Benjamin Graham&#xff09;和多德&#xff08;Daved L. Dodd&#xff09;所合著的《证券分析》出版五十周年&#xff0c;巴菲特应哥伦比亚大学邀请&#xff0c;进行了一次题为《格雷厄姆-多德式的超级投资者》&#xff08;The S…

[VulnHub靶机渗透] WestWild 1.1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

#Js篇:js里面递归的理解

定义&#xff1a; 递归是一种编程技术&#xff0c;它是指一个函数在其定义内部调用自身的过程。 特点&#xff1a; 一个问题可以分解为更小的问题用同样的方法解决&#xff1b;分解后的子问题求解方式一样&#xff0c;不同的是数据规模变小&#xff1b;存在递归终止条件 作…

Springboot根据环境读取application配置文件

目录 1. 首先创建两个不同配置文件 2. pom.xml 配置文件 3. 指定环境 4. 最后启动测试 1. 首先创建两个不同配置文件 分别为开发环境和生产环境 application-dev.properties 和 application-prod.properties application-dev.properties 配置为 1931 端口 application-pro…

[leetcode] 31. 下一个排列

文章目录 题目描述解题方法两遍扫描java代码复杂度分析 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下…

可靠性测试

1 软件可靠性测试 软件可靠性概述 可靠性&#xff08;reliability&#xff09;是指产品在规定的条件下和规定的时间内完成规定功能的能力。 固有可靠性是通过设计、制造赋予产品的可靠性&#xff1b;使用可靠性既受设计、制造的影响&#xff0c;又受使用条件的影响。一般使用可…

(43)找出中枢整数

文章目录 每日一言题目解题思路法一&#xff1a;法二&#xff1a; 代码法一&#xff1a;法二&#xff1a; 结语 每日一言 即使慢&#xff0c;驰而不息&#xff0c;纵令落后&#xff0c;纵令失败&#xff0c;但一定可以达到他所向往的目标。——鲁迅 题目 题目链接&#xff1a…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…

JavaScript流程控制详解之循环结构(倒三角、九九乘法表)

循环结构 在JavaScript中&#xff0c;循环语句指的是在满足某个条件下重复执行 指定的一段代码。若条件结果为true,则重复执行&#xff0c;则进入循环&#xff0c;否则结束循环。 在JavaScript中&#xff0c;循环语句如下&#xff1a; while语句do…while语句for语句 while…

常见关系型数据库产品介绍

更新晚了&#xff0c;不好意思啦&#xff01;继关系型数据库的介绍与历史今天主要和大家分享关系型数据库有哪些产品以及简单的背景介绍。这篇文章介意宝宝们听着舒缓的音乐静静享受。 关系型数据库的产品有很多&#xff0c;下面和大家分享一些比较有名的、使用比较广泛的关系…