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);
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【lesson47】进程通信之system V(共享内存)补充知识

文章目录 补充知识 补充知识 进行通信的key值问题&#xff0c;进程要通信的对方进程怎么能保证对方能看到&#xff0c;并且看到的就是该进程创建的共享内存的。 所以就通过key值来标识共享内存&#xff0c;key值是几不重要&#xff0c;只要在系统里是唯一的即可。 这样server和…

Java图形化界面编程——Container容器 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件&#xff0c;但不能独立存在&#xff0c;它必须内嵌其他容器中使用&#xff0c;默认使用FlowLayout管理其内部组件布局&#xff1b;S…

2月8日作业

1、现有文件test.c\test1.c\main.c,编写Makkefile 代码&#xff1a; CCgcc EXEa.out OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:cleanclean:rm $(OBJS) $(EXE)运行结果&#xff1a; 2、…

【网络】:序列化和反序列化

序列化和反序列化 一.json库 二.简单使用json库 前面已经讲过TCP和UDP&#xff0c;也写过代码能够进行双方的通信了&#xff0c;那么有没有可能这种通信是不安全的呢&#xff1f;如果直接通信&#xff0c;可能会被底层捕捉&#xff1b;可能由于网络问题&#xff0c;一方只接收到…

云计算运营模式介绍

目录 一、云计算运营模式概述 1.1 概述 二、云计算服务角色 2.1 角色划分 2.1.1 云服务提供商 2.1.2 云服务消费者 2.1.3 云服务代理商 2.1.4 云计算审计员 2.1.5 云服务承运商 三、云计算责任模型 3.1 云计算服务模式与责任关系图 3.2 云计算服务模式与责任关系解析…

【LeetCode每日一题】525连续数组 303区域和检索(前缀和的基本概念和3个简单案例)

前缀和 // 构造prefix let prefix [0] arr.forEach(num > {prefix.push(prefix.at(-1) num); })如果想要计算某个区间 i 到 j 这个子数组的和时&#xff0c;可以根据 prefix[j1] - prefix[i] 获得。 例题1&#xff1a;303.区域和检索 - 数组不可变 给定一个整数数组 num…

深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言内存计算体系结构深度神经网络&#xff08;DNN&#xff09;随机梯度的优…

C++进阶(十三)异常

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、C语言传统的处理错误的方式二、C异常概念三、异常的使用1、异常的抛出和捕获2、异常的重新…

【Cocos入门】场景切换(loadScene、preloadScene)

一、loadScene 加载场景 loadScene(sceneName: string, onLaunched: Director.OnSceneLaunched, onUnloaded: Director.OnUnload) : boolean 通过场景名称进行加载场景。返回值为布尔类型 参数&#xff1a; NameTypeDescriptionsceneNamestring场景名称onLaunchedDirector.O…

FPGA_工程_按键控制的基于Rom数码管显示

一 信号 框图&#xff1a; 其中 key_filter seg_595_dynamic均为已有模块&#xff0c;直接例化即可使用&#xff0c;rom_8*256模块&#xff0c;调用rom ip实现。Rom_ctrl模块需要重新编写。 波形图&#xff1a; 二 代码 module key_fliter #(parameter CNT_MAX 24d9_999_99…

基于微信小程序的新生报到系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

分布式springboot 3项目集成mybatis官方生成器开发记录

文章目录 说明实现思路实现步骤第一步&#xff1a;创建generator子模块第二步&#xff1a;引入相关maven插件和依赖第三步&#xff1a;编写生成器配置文件第四步&#xff1a;运行查看结果 说明 该文章为作者开发学习记录&#xff0c;方便以后复习和交流主要内容为&#xff1a;…

Zoho Mail企业邮箱商业扩展第3部分:计算财务状况

在Zoho Mail商业扩展系列的压轴篇章中&#xff0c;王雪琳利用Zoho Mail的集成功能成功地完成了各项工作&#xff0c;并顺利地建立了自己的营销代理机构。让我们快速回顾一下她的成功之路。 一、使用Zoho Mail成功方法概述 首先她通过Zoho Mail为其电子邮件地址设置了自定义域…

如何开始深度学习,从实践开始

将“如何开始深度学习”这个问题喂给ChatGPT和文心一言&#xff0c;会给出很有专业水准的答案&#xff0c;比如&#xff1a; 要开始深度学习&#xff0c;你可以遵循以下步骤&#xff1a; 学习Python编程语言的基础知识&#xff0c;因为它在深度学习框架中经常被使用。 熟悉线性…

2023年出版的新书中提到的《人月神话》(202402更新)(2)共8本

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推…

嵌入式学习之Linux入门篇笔记——13,Linux第一个程序HelloWorld

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是 gcc&#xff1f; gcc 全称&#xff08;gun compiler…

【Docker进阶】镜像制作-用Dockerfile制作镜像(一)

进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作用dockerfile制作镜像dockerfile是什么dockerfile格式为什么需要dockerfileDockerfile指令集合FROMMAINTAINERLABELCOPYENVWORKDIR 用dockerfile制作镜像 用快照制作镜像的缺陷&#xff1a; 黑盒不可重复臃肿 docker…

设计模式3-责任链模式

责任链模式是一种行为设计模式&#xff0c;它允许你创建一个对象链。请求沿着这条链传递&#xff0c;直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。 类图&#xff1a; 从图中可见最大的特点是AbstractHandler它自己聚合了自…

【多模态大模型】BridgeTower:融合视觉和文本信息的多层语义信息,主打复杂视觉-语言任务

BridgeTower 核心思想子问题1&#xff1a;双塔架构的局限性子问题2&#xff1a;不同层次的语义信息未被充分利用子问题3&#xff1a;模型扩展性和泛化能力 核心思想 论文&#xff1a;https://arxiv.org/pdf/2206.08657.pdf 代码&#xff1a;https://github.com/microsoft/Bri…

《剑指 Offer》专项突破版 - 面试题 30 和 31:详解如何设计哈希表以及利用哈希表设计更加高级、复杂的数据结构

目录 一、哈希表的基础知识 二、哈希表的设计 2.1 - 插入、删除和随机访问都是 O(1) 的容器 2.2 - 最近最少使用缓存 一、哈希表的基础知识 哈希表是一种常见的数据结构&#xff0c;在解决算法面试题的时候经常需要用到哈希表。哈希表最大的优点是高效&#xff0c;在哈希表…