TPM 程序设计基础 3-2 :GTK3 窗口与控件
前言
本文来简单讲 GTK3 中窗口简述,具体控件的声明、使用,当然,这里说的控件,都是课设中要使用的。
窗口简述
- 基于 application 创建窗口,请参阅: TPM 程序设计基础 3-0 :GTK3 实例 。
补充:销毁窗口
窗口销毁函数
gtk_widget_destroy( 窗口指针 );
销毁信号回调自定义函数
-
点击右上角的 X 关闭键,实际上是默认向 GTK3 库发送一个
"destroy"
信号,调用一个回调函数,关闭窗口。 -
我们可以截断
"destroy"
这个信号,来回调自定义的回调函数。//连接信号,让点击右上角的 X 关闭按钮后,便调用 extra_pcr_win_destroy 函数 g_signal_connect( 窗口指针 , "delete_event", G_CALLBACK( 回调函数名 ), 参数);
- 更多回调函数信息,请参阅: TPM 程序设计基础 3-1 :g_signal_connect() 函数 。
控件序述
在 GTK3 中如果要简单的使用控件,无外乎就几个步骤,这里以固定容器为例:
-
声明控件的指针。
GtkWidget *A;
-
选择一个控件对应的函数,以控件的指针创建控件。
A = gtk_XXXX_new_with_label(XXXX, XXXX);
-
将创建的控件添加到窗口容器中。
gtk_fixed_put(GTK_FIXED(fixed_box), button_pcr_get, 100, 50);
gtk_fixed_put(GTK_FIXED(fixed_box), A, 100, 50); //fixed_box 是固定容器的指针 //A 是控件的指针 //100 是固定容器的 X 横坐标(左上角 x = 0) //50 是固定容器的 Y 纵坐标(左上角 y = 0)
-
设置控件的高度、宽度等参数。
gtk_widget_set_size_request(A, 50, 60); //A 是控件的指针 //50 是控件宽度 //60 是控件高度
-
使用控件触发回调函数。(主要是按钮、菜单等控件)
//连接信号,让点击按钮后,便调用 print_hello 函数 g_signal_connect(A , "clicked" , G_CALLBACK( print_hello ) , NULL);
- 更多回调函数信息,请参阅: TPM 程序设计基础 3-1 :g_signal_connect() 函数 。
-
使用函数调用控件的值等等。(主要是单/多行文本框等控件)
- 见后文 文本框 控件。
实例
以基于固定容器的控件为例。
- 这是一个最简单的 “button” 按钮控件的声明与使用过程。
static void controller(GtkWidget *fixed_box)
{
//声明控件的指针
GtkWidget *button_pcr_get;
//选择一个 button 控件对应的函数,以控件的指针创建 按钮
button_pcr_get = gtk_button_new_with_label("读取 PCR");
//button 设置高度、宽度,并添加到固定容器布局
gtk_fixed_put(GTK_FIXED(fixed_box), button_pcr_get, 100, 50);
//设置 button 控件的高度、宽度
gtk_widget_set_size_request(button_pcr_get, 100, 50);
//连接信号,让点击按钮后,便调用 get_pcr_value 函数
g_signal_connect(button_pcr_get , "clicked" , G_CALLBACK( get_pcr_value ) , NULL);
......
}
更多控件
button 按钮控件
-
例子,具体见实例:
//声明控件的指针 GtkWidget *button_pcr_get; //选择一个 button 控件对应的函数,以控件的指针创建 按钮 button_pcr_get = gtk_button_new_with_label("读取 PCR");
文本框 控件
文本框 控件 添加到窗口容器
以及 设置控件的高度、宽度等参数
同 button 实例。
单行文本框
-
例子:
//声明控件的指针 GtkWidget *entry_pcr_extra_string); // 创建行编辑 entry_pcr_extra_string = gtk_entry_new();
多行文本框
-
例子:
//声明 多行文本框 控件的指针 GtkWidget *entry_pcr_read; //创建一个多行文本框 entry_pcr_read = gtk_text_view_new();
文本框 更多相关函数
设置 文本框 显示最大字符长度
-
//设置 文本框 编辑显示最大字符的长度为 40 gtk_entry_set_max_length(GTK_ENTRY( 文本框指针 ), 40);
设置 文本框 行编辑内的值
-
//首次打开窗口是加载的值 gtk_entry_set_text(GTK_ENTRY( 文本框指针 ), "123");
使用函数调用控件的值
-
//声明 const gchar * 字符串指针 const gchar *entry_A_text; //将 文本框 中的字符串,赋予 const gchar * 字符串指针 entry_A_text = gtk_entry_get_text(GTK_ENTRY( 文本框指针 ));
字符串输出显示到 文本框 控件
注意:这里的输出显示函数 单行 与 多行 不一样 。
-
单行:
gtk_entry_set_text(GTK_ENTRY( 单行文本框指针 ), "2+2=4");
-
多行:
//声明 GtkTextBuffer * 字符串缓冲区 GtkTextBuffer *buffer; //为多行文本框控件分配缓冲区 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW( 多行文本框指针 )); //从头显示缓冲区字符 gtk_text_buffer_set_text (buffer, "1234567890abcdef", -1);
提示弹窗
-
提示弹窗则更加特殊,创建函数的参数更多。
相比于控件,其实更接近于创建一个新的窗口。
例子:
//声明 提示弹窗 的指针 GtkWidget *dialog; //创建一个提示弹窗,"note info" 为提示弹窗的提示信息 dialog = gtk_message_dialog_new(struct_pcr_extra.win_extra, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, dialog_title, "note info"); //设置提示弹窗标题 gtk_window_set_title(GTK_WINDOW(dialog), "title"); //以指针运行 提示弹窗 gtk_dialog_run(GTK_DIALOG(dialog)); //点击确定关闭提示弹窗 gtk_widget_destroy(dialog);