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://xiahunao.cn/news/2775380.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper集群搭建(3台)

准备工作 1、提前安装好hadoop102、hadoop103、hadoop104三台机器&#xff0c;参照&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、提前下载好Zookeeper安装包并上传到/opt/software上、安装包&#xff0c;链接&#xff1a;https://pan.baidu.com/…

Xcode配置GLFW GLAD (MAC)

这里的GLFW用的是静态链接 博主反复修改&#xff0c;实在是没能找到为什么用动态会出现线程报错 下载GLAD:版本我一般是选倒数第二新&#xff0c;profile记得选core 点击GENRATE 点glad.zip获得下载 下载GLFW 点击download 最后&#xff0c;将两个文件都放到项目里面去 打开…

深入理解Netty及核心组件使用—上

目录 Netty的优势 为什么Netty使用NIO而不是AIO&#xff1f; Netty基本组件 Bootstrap、EventLoop(Group) 、Channel 事件和 ChannelHandler、ChannelPipeline ChannelFuture Netty入门程序 服务端代码 客户端代码 运行结果 Netty的优势 1. API 使用简单&#xff0c…

用HTML5实现灯笼效果

本文介绍了两种实现效果&#xff1a;一种使用画布&#xff08;canvas&#xff09;标签/元素&#xff0c;另一种不用画布&#xff08;canvas&#xff09;标签/元素主要使用CSS实现。 使用画布&#xff08;canvas&#xff09;标签/元素实现&#xff0c;下面&#xff0c;在画布上…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

基于 Python opencv 的人脸识别的酒店客房入侵系统的检测

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

【深度学习:掌握监督学习】掌握监督学习综合指南

【深度学习&#xff1a;掌握监督学习】掌握监督学习综合指南 监督学习的定义和简要说明监督学习在人工智能中的重要性和相关性概述什么是监督学习&#xff1f;基本概念主要组件&#xff1a;输入要素和目标标签 训练监督式学习模型监督学习算法的类型分类回归每个类别中的流行算…

Rust 格式化输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出&#xff0c;包括fmt::Debug&…

3.4-媒资管理之视频处理+xx-job分布式任务

文章目录 媒资管理6 视频处理6.1 需求6.1.1 总体需求6.7.3 FFmpeg 的基本使用6.7.4 视频处理工具类 6.2 分布式任务处理6.2.1 什么是分布式任务调度6.2.2 XXL-JOB介绍6.2.3 搭建XXL-JOB6.2.3.1 调度中心6.2.3.2 执行器6.2.3.3 执行任务 6.2.4 分片广播 6.3 技术方案6.3.1 作业分…

【博云2023】乘龙一跃腾云海,侧目抬手摘星河

癸卯渐远&#xff0c;甲辰渐至&#xff0c;预示着被汗水浇灌的种子&#xff0c;必将顶开冻土&#xff0c;迎接阳光。 每逢春节&#xff0c;当亲友彼此问候&#xff0c;博云人总能自豪地说&#xff0c;我们认真地、努力地奋斗&#xff0c;让我们能自信地踏上新的征程。 我们的…

【Web】Spring rce CVE-2022-22965漏洞复现学习笔记

目录 原理概览 漏洞简述 Tomcat AccessLogValve 和 access_log 例题: 原理概览 spring框架在传参的时候会与对应实体类自动参数绑定&#xff0c;通过“.”还可以访问对应实体类的引用类型变量。使用getClass方法&#xff0c;通过反射机制最终获取tomcat的日志配置成员属性…

生成验证码-超简单

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

Django中的SQL注入攻击防御策略

Django中的SQL注入攻击防御策略 SQL注入是一种常见的网络安全威胁&#xff0c;可以导致数据库被非法访问和数据泄露。本文将介绍在Django框架中防止SQL注入攻击的关键方法&#xff0c;包括使用参数化查询、使用ORM、进行输入验证和使用安全的编码实践。 SQL注入是一种利用应用程…

幻兽帕鲁服务器部署与参数修改教程(WindowsLinux)

教程合集 【阿里云部署攻略】&#xff1a;【官方指南】阿里云搭建幻兽帕鲁服务器指南汇总 【腾讯云部署教程】&#xff1a;【官方指南】腾讯云搭建幻兽帕鲁服务器指南汇总 选服务器 阿里云新用户专享优惠&#xff1a;帕鲁官方推荐配置4核16G 以及 8核32G&#xff0c;新用户…

计算机网络相关题目及答案(第五章实验)

实验:套接字编程作业5:ICMP ping 源代码如下: # -*- coding: utf-8 -*- """ SAFA_LIYT """ import socket import os import sys import struct import time import select import binasciiICMP_ECHO_REQUEST = 8# 计算checksum def checks…

编码安全风险是什么,如何进行有效的防护

2011年6月28日晚20时左右&#xff0c;新浪微博突然爆发XSS&#xff0c;大批用户中招&#xff0c;被XSS攻击的用户点击恶意链接后并自动关注一位名为HELLOSAMY的用户&#xff0c;之后开始自动转发微博和私信好友来继续传播恶意地址。不少认证用户中招&#xff0c;也导致该XSS被更…

深入理解ES的倒排索引

目录 数据写入过程 词项字典 term dictionary 倒排表 posting list FOR算法 RBM算法 ArrayContainer BitMapContainer 词项索引 term index 在Elasticsearch中&#xff0c;倒排索引的设计无疑是惊为天人的&#xff0c;下面看下倒排索引的结构。 倒排索引分为词项索引【…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

ubuntu22.04laptop OpenCV Get Started: 005_rotate_and_translate_image 1. 源由2. translate/rotate应用Demo3 translate_image3.1 C应用Demo3.2 Python应用Demo3.3 平移图像过程 4. rotate_image4.1 C应用Demo4.2 Python应用Demo4.3 旋转图像过程 5. 总结6. 参考资料 1. 源由…

MATLAB环境下用于提取冲击信号的几种解卷积方法

卷积混合考虑了信号的时延&#xff0c;每一个单独源信号的时延信号都会和传递路径发生一 次线性瞬时混合&#xff1b;解卷积的过程就是找一个合适的滤波器&#xff0c;进行反卷积运算&#xff0c;得到源信号的近似解。 声音不可避免的会发生衍射、反射等现象&#xff0c;所以&…