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.mzph.cn/news/674852.shtml

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

相关文章

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…

AD9361多片同步设计方法

本文基于ZC706FMCOMMS5的平台&#xff0c;介绍了多片AD9361同步的方法。并将该设计移植到自行设计的ZYNQ70354片AD9361(实现8路同步收发)的电路板上。本设计采用纯逻辑的方式&#xff0c;仅使用了ZYNQ芯片的PL部分。 9361多芯片同步主要包括基带同步和射频同步两大块任务。其中…

26.云原生ArgoCD高级之ApplicationSet

云原生专栏大纲 文章目录 ApplicationSet介绍ApplicationSet 特性ApplicationSet 安装ApplicationSet 工作原理ApplicationSet 生成器列表类型生成器集群生成器基础使用方法Label Selector 指定集群Values 字段传递额外的参数 git生成器git目录生成参数排除目录git文件生成器矩…

数据结构与算法-链表(力扣附链接)

之前我们对C语言进行了一定的学习&#xff0c;有了一些基础之后&#xff0c;我们就可以学习一些比较基础的数据结构算法题了。这部分的知识对于我们编程的深入学习非常有用&#xff0c;对于一些基本的算法&#xff0c;我们学习之后&#xff0c;就可以参加一些编程比赛了&#x…

【CV论文精读】【MVDet】Multiview Detection with Feature Perspective Transformation

0.论文摘要 合并多个摄像机视图进行检测减轻了拥挤场景中遮挡的影响。在多视图检测系统中&#xff0c;我们需要回答两个重要问题。首先&#xff0c;我们应该如何从多个视图中聚合线索&#xff1f;第二&#xff0c;我们应该如何从空间上相邻的位置聚集信息&#xff1f;为了解决…

LabVIEW网络测控系统

LabVIEW网络测控系统 介绍了基于LabVIEW的网络测控系统的开发与应用&#xff0c;通过网络技术实现了远程的数据采集、监控和控制。系统采用LabVIEW软件与网络通信技术相结合&#xff0c;提高了系统的灵活性和扩展性&#xff0c;适用于各种工业和科研领域的远程测控需求。 随着…

生成验证码-超简单

引言 在Web开发中&#xff0c;验证码是一种常见的防止恶意破解、自动化提交的有效手段。在Java项目中&#xff0c;我们可以使用Hutool工具库快速实现验证码功能。Hutool是一个Java工具包&#xff0c;它以简洁易用著称&#xff0c;其中包含了验证码模块&#xff0c;可以让我们轻…

今日arXiv最热NLP大模型论文:无需数据集,大模型可通过强化学习与实体环境高效对齐 | ICLR2024

引言&#xff1a;将大型语言模型与环境对齐的挑战 虽然大语言模型&#xff08;LLMs&#xff09;在自然语言生成、理解等多项任务中取得了显著成就&#xff0c;但是在面对看起来简单的决策任务时&#xff0c;却常常表现不佳。这个问题的主要原因是大语言模型内嵌的知识与实际环…

在windows的控制台实现贪吃蛇小游戏

欢迎来到博主的文章 博主id&#xff1a;代码小豪 前言&#xff1a;看懂这篇文章需要具有C语言基础&#xff0c;还要对单链表具有一定的理解。如果你只是想要试玩这个游戏&#xff0c;可以直接在文章末尾找到源码 由于实现贪吃蛇需要调用Win32 API函数&#xff0c;这些函数我会…

npm 上传一个自己的应用(4) 更新自己上传到NPM中的工具版本 并进行内容修改

前面 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们讲了将自己写的一个函数发送到npm上 那么 如果我们想到更好的方案 希望对这个方法进行修改呢&#xff1f; 比如 我们这里加一个方法 首先 我们还是要登录npm npm login然后 根据要求填写 Username 用…

【Linux】linux自动化构建工具make/makefile

linux自动化构建工具make/makefile 一&#xff0c;makefile是什么二&#xff0c;如何写makefile三&#xff0c;文件的三个时间属性四&#xff0c;makefile的推导 一&#xff0c;makefile是什么 对于make和makefile&#xff0c;简单来说&#xff0c;make是一个命令&#xff0c;用…

VSCode python插件:找不到自定义包导致语法解析失败

众所周知&#xff0c;在python源码中&#xff0c;我们可以通过 sys.path.append("path-to-lib") 来为python解释器添加自定义包的寻找路径。 但是vscode的默认python插件可没法聪明到根据这句话去找这个包&#xff0c;这就会导致后续代码中使用了这个库的部分无法享…

个人博客搭建(总结)

文章目录 前言个人基础学习经验耗时最终搭配血泪史总结&#x1fa78;Gitee or GitHub域名-该买还是得买&#xff01;域名后缀服务器 参考博主碎碎念&#x1f64a; 前言 本网站目前只搭好了一个大概框架&#xff0c;博主没学过前端&#xff0c;所以会有许多bug和不合理的设置。…

消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ

消息队列 消息队列&#xff1a;它主要用来暂存生产者生产的消息&#xff0c;供后续其他消费者来消费。 它的功能主要有两个&#xff1a; 暂存&#xff08;存储&#xff09;队列&#xff08;有序&#xff1a;先进先出 从目前互联网应用中使用消息队列的场景来看&#xff0c;…

c入门第十篇——指针入门

一句话来说: 指针就是存储了内存地址值的变量。 在前面讨论传值和传址的时候&#xff0c;我们就已经开始使用了指针来传递地址。 在正式介绍指针之前&#xff0c;我们先来简单了解一下内存。内存可以简单的理解为一排连续的房子的街道&#xff0c;每个房子都有自己的地址&#…

华清作业day56

SQLite特性&#xff1a; 零配置一无需安装和管理配置&#xff1b;储存在单一磁盘文件中的一个完整的数据库&#xff1b;数据库文件可以在不同字节顺序的机器间自由共享&#xff1b;支持数据库大小至2TB&#xff1b;足够小&#xff0c;全部源码大致3万行c代码&#xff0c;250KB…

midnightsun-2018-flitbip:任意地址写

题目下载 启动脚本 启动脚本如下&#xff0c;没开启任何保护 #!/bin/bash qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./initrd \-nographic \-monitor /dev/null \-append "nokaslr root/dev/ram rw consolettyS0 oopspanic paneic1 quiet" 2>…

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】

“掌握温度&#xff0c;感知湿度&#xff0c;一触即知&#xff01;”DHT11温湿度传感器&#xff0c;为您的生活增添一份关怀与精准。#非标协议【下】 前言预备知识1.DHT11温湿度传感器初识1.1产品概述1.2与51单片机接线1.3数据传送逻辑和数据格式 2.发送时序检测DHT11温湿度传感…

从零开始手写mmo游戏从框架到爆炸(十一)— 注册与登录

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 从这一章开始&#xff0c;我们进入业务的部分&#xff0c;从注册登录开始。 创建注册和登录的路由 package com.loveprogrammer.command.server;public interface Se…

vue 实现一个持续时间定时器组件

vue 实现一个定时器组件 效果图子组件父组件 效果图 子组件 新建一个timer.vue文件 <template><span :class"{red: string > 600}">{{ string | formatDurationS }}</span> </template> <script>export default {name: timer,pro…