TPM 程序设计基础 3-2 :GTK3 窗口与控件

Posted yogile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TPM 程序设计基础 3-2 :GTK3 窗口与控件相关的知识,希望对你有一定的参考价值。

前言

本文来简单讲 GTK3 中窗口简述,具体控件的声明、使用,当然,这里说的控件,都是课设中要使用的。

窗口简述

补充:销毁窗口

窗口销毁函数
gtk_widget_destroy( 窗口指针 );
销毁信号回调自定义函数
  • 点击右上角的 X 关闭键,实际上是默认向 GTK3 库发送一个 "destroy" 信号,调用一个回调函数,关闭窗口。

  • 我们可以截断 "destroy" 这个信号,来回调自定义的回调函数。

    //连接信号,让点击右上角的 X 关闭按钮后,便调用 extra_pcr_win_destroy 函数
    g_signal_connect( 窗口指针 , "delete_event", G_CALLBACK( 回调函数名 ), 参数);
    

控件序述

在 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);
    
  • 使用函数调用控件的值等等。(主要是单/多行文本框等控件)

    • 见后文 文本框 控件。

实例

以基于固定容器的控件为例。

  • 这是一个最简单的 “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);
    

以上是关于TPM 程序设计基础 3-2 :GTK3 窗口与控件的主要内容,如果未能解决你的问题,请参考以下文章

Python gtk3 窗口监听输入事件

TPM 程序设计基础 2-2 :tpm_func.c 以及 spnam_check.c 分析

无法将 gnuplot x11 窗口嵌入 Gtk3 套接字

Perl/Gtk3,给窗口添加背景图片

GTK3 - 如何将窗口发送到后台

使用 Gtk3 和 Cairo 绘制到 GdkWindow 根窗口