14-6 使用 glade 完成布局

1. 使用 glade 新增对象及信号

        前端:使用 glade 修改布局与信号。例如,在 glade 中新建对象 GtkTextBuffer,在将其 id 命名为 button2_data,内容为 “你好,中国!”。

        设置构件按钮2点击信号的回调函数为 print_hello2,且在调用该函数时传入 GtkTextBuffer 对象类型的 button2_data 参数。

2. 实现代码与 glade 新增对象及信号的链接

        后端:修改代码,实现前端修改的样式。理想结果为,点击按钮2,控制台出现“你好,中国!”。具体修改流程为:

        1)绑定 glade 中设置的信号需要借用 gmodule 库的函数。前往 msys/mingw64.exe,使用如下代码查询 gmodule 包名称。

pkg-config --list-all | grep gmodule

        2)修改配置文件,引入 gmodule 库。

cmake_minimum_required(VERSION 3.17)

get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} C)

set(CMAKE_C_STANDARD 11)

## 使用 Cmake 找到 GTK 框架位置
FIND_PACKAGE(PkgConfig REQUIRED)  # 声明使用pkg去找
PKG_CHECK_MODULES(GTK3 REQUIRED gtk+-3.0)  # pkg 找到 gtk+-3.0的框架,并将其命名为 GTK3

# 引入 GTK 框架的头文件
INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS})

# 引入 GTK 框架的链接库
LINK_DIRECTORIES(${GTK3_LIBRARY_DIRS})

# 引入 GTK 编译时所需要的参数
ADD_DEFINITIONS(${GTK3_CFLAGS_OTHER})

include_directories("include")

## 引入 gmodule
FIND_PACKAGE(PkgConfig REQUIRED)  # 声明使用pkg去找
PKG_CHECK_MODULES(GMODULE REQUIRED gmodule-export-2.0)  # pkg 找到 gmodule-export-2.0 的框架,并将其命名为 GMODULE

# 引入 gmodule 框架的头文件
INCLUDE_DIRECTORIES(${GMODULE_INCLUDE_DIRS})

# 引入 gmodule 框架的链接库
LINK_DIRECTORIES(${GMODULE_LIBRARY_DIRS})

## 编译.c
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
foreach(file ${files})
    get_filename_component(name ${file} NAME)
    add_executable(${name} ${file})

    # 将可执行程序与链接库进行链接(放置一起)
    target_link_libraries(${name} ${GTK3_LIBRARIES})
    target_link_libraries(${name} ${GMODULE_LIBRARIES})  # 将 GMODULE编译的可执行程序与链接库放置一起

endforeach()

        3)修改相应代码,使代码能够获取到 glade 修改的 ui 文件中的布局及信号

#include <gtk/gtk.h>

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

// 传入 GTKTextBuffer 类型数据
// 加 G_MODULE_EXPORT 相当于将函数名暴露出去,让 glade 可以识别到
G_MODULE_EXPORT void print_hello2(GtkWidget *widget, GtkTextBuffer *buffer){

  // 获取 GtkTextBuffer 内容,可以选定获取buffer中某一段字符串
  // 设置字符串起始位置
  GtkTextIter start;
  gtk_text_buffer_get_start_iter(buffer, &start);

  // 获取字符串末尾位置
  GtkTextIter end;
  gtk_text_buffer_get_end_iter(buffer, &end);

  // 获取 Buffer 内容,gtk_text_buffer_get_text 最后一个参数判断是否有隐藏字符
  g_print("hello2: %s\n", gtk_text_buffer_get_text(buffer, &start, &end, FALSE));
}

// 给定 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, "builder2.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(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL);  // 绑定退出函数

  // 绑定 glade 中设置的信号 (glade 设置的信号全部保存在了 ui 文件中)
  // 第二个参数含义为传给 ui 文件中所有信号的一个参数,不同信号按理说应该接收的不一样,故此处设置为NULL
  gtk_builder_connect_signals(builder, NULL);

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

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

  return 0;
}

         4)执行程序,验证修改结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给你简单介绍一下使用glfw glad绘制三维场景的步骤。 1. 安装glfw glad 首先,你需要在你的项目中安装glfw glad。你可以使用包管理器如apt、brew或者conda,也可以手动下载和编译glfw glad的源代码。 2. 初始化glfw 在你的代码中,你需要在使用glfw之前初始化它。这可以通过调用glfwInit()函数来完成。 ``` if (!glfwInit()) { // 初始化失败 return -1; } ``` 3. 创建窗口 接下来,你需要创建一个窗口来绘制你的3D场景。你可以使用glfwCreateWindow()函数来创建一个窗口。 ``` GLFWwindow* window = glfwCreateWindow(800, 600, "My Window", NULL, NULL); if (!window) { glfwTerminate(); return -1; } ``` 4. 设置上下文 在创建窗口之后,你需要设置OpenGL上下文。这可以通过调用glfwMakeContextCurrent()函数来完成。 ``` glfwMakeContextCurrent(window); ``` 5. 加载glad 在设置上下文之后,你需要加载glad。这可以通过调用gladLoadGLLoader()函数来完成。 ``` if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { // glad加载失败 return -1; } ``` 6. 绘制三维场景 现在,你已经准备好绘制你的3D场景了。你可以使用OpenGL的函数来创建和渲染场景。这里只是简单的介绍一下,具体的实现取决于你的需求。 7. 交换缓冲区 当你完成了绘制场景之后,你需要交换缓冲区来显示你的场景。这可以通过调用glfwSwapBuffers()函数来完成。 ``` glfwSwapBuffers(window); ``` 8. 处理输入事件 最后,你需要处理输入事件。这可以通过调用glfwPollEvents()函数来完成。 ``` glfwPollEvents(); ``` 以上就是使用glfw glad绘制三维场景的简单步骤。希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值