14-5 使用 xml 完成布局

2023-10-27

        14-3 小节中,helloworld程序创建窗口使用代码创建。此外,也可使用 xml 完成窗口布局,代码仅仅用来处理数据逻辑,实现布局和数据处理相分离

        布局的 ui 代码,builder.ui:

<interface>
    <object id="window" class="GtkWindow">
        <property name="visible">True</property>
        <property name="title">Grid</property>
        <property name="border-width">10</property>
        <child>
            <object id="grid" class="GtkGrid">
                <property name="visible">True</property>
                <child>
                    <object id="button1" class="GtkButton">
                        <property name="visible">True</property>
                        <property name="label">Button 1</property>
                    </object>
                    <packing>
                        <property name="left-attach">0</property>
                        <property name="top-attach">0</property>
                    </packing>
                </child>
                <child>
                    <object id="button2" class="GtkButton">
                        <property name="visible">True</property>
                        <property name="label">Button 2</property>
                    </object>
                    <packing>
                        <property name="left-attach">1</property>
                        <property name="top-attach">0</property>
                    </packing>
                </child>
                <child>
                    <object id="quit" class="GtkButton">
                        <property name="visible">True</property>
                        <property name="label">Quit</property>
                    </object>
                    <packing>
                        <property name="left-attach">0</property>
                        <property name="top-attach">1</property>
                        <property name="width">2</property>
                    </packing>
                </child>
            </object>
            <packing>
            </packing>
        </child>
    </object>
</interface>

        具体代码如下。与 14-3 小节相比,不再显示地创建 GtkApplication 进行程序的执行,而是利用 GObject 和 GtkBuilder 完成程序执行。

#include <gtk/gtk.h>

/*
 * 定义一个打印函数,在点击按钮时调用该函数
 * @param widget: 相当于GtkContainer 容器类的父类
 * @param data: 用户点击按钮时传入的数据
 */
static void print_hello(GtkWidget *widget, char const *data){
  g_print("hello: %s\n", data);
}

// 给定 ui 文件,进行 helloworld 程序编写
int main(int argc, char **argv){

  gtk_init(&argc, &argv);

  // 1. 加载布局文件 builder.ui
  // 新建builder
  GtkBuilder *builder = gtk_builder_new();

  // 利用 builder 加载布局文件
  GError *error = NULL;
  if(gtk_builder_add_from_file(builder, "builder.ui", &error) == 0){  // 如果加载失败
    g_printerr("Error loading files: %s\n", error->message);
    g_clear_error(&error);  // 退出之前不要忘记释放相应内存
    return -1;
  }

  // 2. 获取布局文件中各构件,利用 ui 文件中的各构件 id 进行获取
  // 获取窗口对象,其在 ui 文件中的 id 为 "window"
  GObject *window = gtk_builder_get_object(builder, "window");

  // 获取按钮1,按钮2,以及退出按钮
  GObject *button1 = gtk_builder_get_object(builder, "button1");
  GObject *button2 = gtk_builder_get_object(builder, "button2");
  GObject *quit = gtk_builder_get_object(builder, "quit");

  // 3. 对各构件进行事件的绑定
  // 对窗口进行事件绑定 
  // destroy 相当于点击窗体右上角的 x 按钮,不绑定的情况下,点击 x 窗口消失,但主程序并不会退出,仍在后台运行
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

  // 对按钮进行事件绑定
  g_signal_connect(button1, "clicked", G_CALLBACK(print_hello), "button1");
  g_signal_connect(button2, "clicked", G_CALLBACK(print_hello), "button2");
  g_signal_connect(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL);  // 绑定退出函数

  // builder 解引用,让其可以释放内存。可以解引用的原因是已经利用builder加载了布局,获取了各构件
  g_object_unref(builder);

  gtk_main();  // 运行该窗口程序

  return 0;
}

         注意窗口绑定的事件 destroy,不绑定的情况下,点击窗口右上角的 x,仅仅会导致窗口消失,但主程序不会退出:

         绑定 destroy 事件后,点击窗口右上角 x ,可以发现程序会正常退出,不会在后台继续执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

14-5 使用 xml 完成布局 的相关文章

  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • 消息队列之基础知识(一)

    来自公众号 灰子学技术 欢迎关注 笔者最近在看消息队列 顺便做了整理 在学习这个知识点之前 笔者问了自己下面几个问题 什么是消息队列 为什么我们需要消息队列 消息队列有什么用 常用的消息队列有那些 以下内容 读者便从这几个方面开始说起 一
  • windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题

    在Windows7下调用vs2013生成的Caffe静态库时经常会提示Check failed registry count type 1 0 vs 1 Unknown layer type的错误 如下图 这里参考网上资料汇总了几种解决方法
  • 安卓音乐播放器--侧边栏

    侧边栏学习 参考资料 http www chinatarena com Html adpeixun 201307 5251 html 还有一个参考的代码 最后自己的理解是 在scrollView中添加两个水平的视图 musicListLay
  • react中实现拖拽排序react-dnd

    dnd文档 html 拖拽排序 import React useState useRef from react import cloneDeep from lodash import styles from index less const
  • 中国工程院院士倪光南:拥抱开源 与世界协同创新

    2022年7月21日 在中国开源软件推进联盟主办 赛迪传媒 软件和集成电路 杂志社联合承办 CSDN 独家直播的 第十七届开源中国开源世界高峰论坛 上 中国工程院院士倪光南带来了 拥抱开源 与世界协同创新 的主题演讲 以下为倪光南演讲实录
  • 【uni-app】【Android studio】手把手教你运行uniapp项目到Android App

    最开始想写一个自定义背景的弹窗 因为要用到项目的好几个地方 不希望每个地方都需要引入 而且只需要放张图片 加个关闭按钮和功能按钮就行 类似这种效果 开始写的时候找了一篇博客 写的很详细 但是这个是Vue2的 uniapp实现自定义弹窗组件
  • 轴上键槽怎么标注

    百度知道 https zhidao baidu com question 1638366488494069980 html
  • MATLAB图像拼接算法及实现

    论文关键词 图像拼接 图像配准 图像融合 全景图 论文摘要 图像拼接 image mosaic 技术是将一组相互间重叠部分的图像序列进行空间匹配对准 经重采样合成后形成一幅包含各图像序列信息的宽视角场景的 完整的 高清晰的新图像的技术 图像
  • java引用ScriptEngine解析表达式实现计算器功能

    包名 import javax script 使用 String str 2 6 7 ScriptEngine se new ScriptEngineManager getEngineByName JavaScript try double
  • 大数据技术原理与应用(复习)

    大数据 第一章 大数据的四个基本特性 p8 4V 数据量大 Volume 数据类型繁多 Variety 处理速度快 Velocity 价值密度低 Value 举例说明大数据的关键技术 p16 数据采集与预处理 利用ETL工具将分布在异构数据
  • Python123题目解析

    老样子 复习第一位 持续更新 慢慢附加知识点 python123 英寸和厘米的交互 升级版 描述 虽然我国已经很好的普及了国际单位制 而在现实生活中 仍然有很多地方采用了英制单位来描述 例如 我们买一台65寸的电视 这个地方的寸指的就是英寸
  • 编写测试用例的测试方法(等价类、判定表、边界值、正交排列法、场景法)

    一 等价类划分法 1 应用场合 在程序中 有数据输入的地方适合使用等价类划分法进行测试 方法思想 范围 将大量数据划分成若干的范围 等价类 再从每个范围中抽取少量代表数据进行测试 抽样测试 2 两个概念 1 有效等价类 对程序来说 正确的
  • Gerrit合并分支cherry-pick后提交代码push报错,43366 closed问题处理

    Gerrit合并分支cherry pick后提交代码push报错 43366 closed问题处理 这个问题是我cherry pick别的分支代码时遇到的 至于如何cherry pick代码可以参考 链接 如何cherry pick分支代码
  • html字符串转json

    业务场景 后端返回给前端的数据中 有html格式的字符串 如下 font color red 我是提示信息 font 后端使用fastjson data toJsonString 响应给前端 但是格式不是标准的json格式 如 msg fo
  • Qt 的信号与槽

    QT的信号与槽的三种实现方式 3种方式 1 直接在设计选项卡中拖动连接控件 然后选择控件间的关联函数 2 头文件mainwindows h中 ifndef MAINWINDOW H define MAINWINDOW H include
  • jdk8 api

    JDK 8是Java开发工具包的第8个主要版本 它于2014年3月18日发布 JDK 8 API是Java开发人员使用的程序包 类 接口和注释的集合 用于创建Java程序 它包括Java核心库 如java lang和java util 以及
  • MSP430F5529学习笔记(2)——点亮LED

    TI官方MSP430F5529开发板原理图和中文开发手册 MSP430F5529学习笔记 1 环境配置 目录 原理图和中文开发手册获取方法 点亮LED1 分析电路图 写程序 点亮LED1 1 首先我们需要告诉单片机 P1 0是输入还是输出
  • 二叉树的链式存储结构及(C语言)实现

    上一节讲了二叉树的顺序存储 通过学习你会发现 其实二叉树并不适合用数组存储 因为并不是每个二叉树都是完全二叉树 普通二叉树使用顺序表存储或多或多会存在空间浪费的现象 本节我们学习二叉树的链式存储结构 图 1 普通二叉树示意图 如图 1 所示
  • Makefile语法

    下面来介绍Makefile的基本语法 12 2 1 引入文件 OpenWrt 使用三个 makefile 的子文件 分别为 Include TOPDIR rules mk Include INCLUDE DIR kernel mk Incl
  • 14-5 使用 xml 完成布局

    14 3 小节中 helloworld程序创建窗口使用代码创建 此外 也可使用 xml 完成窗口布局 代码仅仅用来处理数据逻辑 实现布局和数据处理相分离 布局的 ui 代码 builder ui