GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

查看: 4416|回复: 7

2.2 按钮

[复制链接]
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-8-27 22:24:43 | 显示全部楼层 |阅读模式
    本帖最后由 白浪 于 2013-8-27 22:31 编辑

       
      The GtkButton widget is generally used to trigger a callback function that is called when the button is pressed. The various signals and how to use them are outlined below.
      The GtkButton widget can hold any valid child widget. That is, it can hold almost any other standard GtkWidget. The most commonly used child is the GtkLabel.

    一般来说GtkButton在被点击时会用来触发回调函数,它可以控制所有的子控件,还有大部的有控件,常常用来控制GtkLabel控件。
    一般来说在gtk程序中要放在容器里面才可以显示出来,从上节我们可以看得出来窗口是最基本的容器,所以我们可以把按钮放到窗口中再显示。

    如上图中,在窗口里面有一个巨大的按钮,可以照如下代码编程:
    1. #include <gtk/gtk.h>

    2. int main (void)
    3. {
    4.     GtkWidget *window = NULL;
    5.     GtkWidget *button = NULL;
    6.     // 初始化 GTK
    7.     gtk_init(NULL, NULL);
    8.     // 建立一個新的 GtkWindow
    9.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    10.     //建立一个新的button
    11.     button = gtk_button_new ();
    12.     // 設置標題
    13.     gtk_window_set_title (GTK_WINDOW (window), "Window");
    14.     // 設置默認大小
    15.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    16.     //将button放置到window容器中
    17.     gtk_container_add(GTK_CONTAINER(window),button);
    18.     // 處理 "destroy" 信號,當窗口被關閉時退出程序
    19.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    20.     // 顯示窗口和所有子組件
    21.     gtk_widget_show_all (window);
    22.     // 開始事件循環
    23.     gtk_main ();
    24.     // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    25.     return 0;
    26. }
    复制代码
    有的童鞋就会问了,为什么按钮上没有字啊,其实我们可以用button = gtk_button_new_with_label ("button")来创建按钮,如下图所示

    下面我们来做button的简单回调,当button被按下时,我们在终端打印出"button clicked!"
    1. #include <gtk/gtk.h>

    2. void on_button_clicked(void)
    3. {
    4.     //在终端中打印
    5.     g_printf("button clicked!!!\n");
    6. }

    7. int main (void)
    8. {
    9.     GtkWidget *window = NULL;
    10.     GtkWidget *button = NULL;
    11.     // 初始化 GTK
    12.     gtk_init(NULL, NULL);
    13.     // 建立一個新的 GtkWindow
    14.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    15.     //建立一个新的button
    16.     //button = gtk_button_new ();
    17.     button = gtk_button_new_with_label ("button");
    18.     // 設置標題
    19.     gtk_window_set_title (GTK_WINDOW (window), "Window");
    20.     // 設置默認大小
    21.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    22.     //将button放置到window容器中
    23.     gtk_container_add(GTK_CONTAINER(window),button);
    24.     // 處理 "destroy" 信號,當窗口被關閉時退出程序
    25.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    26.     g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), NULL);
    27.     // 顯示窗口和所有子組件
    28.     gtk_widget_show_all (window);
    29.     // 開始事件循環
    30.     gtk_main ();
    31.     // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    32.     return 0;
    33. }
    复制代码
    如图所示:





    本节教程到此休息一下,本节作业,阅读以下英文,并用gtk_button_new_from_stock ()来创建一个按钮,并在鼠标进入button里在终端打印enter,在鼠标离开button时打印leave,提示:进入的触发是“enter”,离开是“leave”.

    gtk_button_new_from_stock ()
    GtkWidget *         gtk_button_new_from_stock           (const gchar *stock_id);
    Creates a new GtkButton containing the image and text from a stock item. Some stock ids have preprocessor macros like GTK_STOCK_OK and GTK_STOCK_APPLY.

    If stock_id is unknown, then it will be treated as a mnemonic label (as for gtk_button_new_with_mnemonic()).

    stock_id :
    the name of the stock item
    Returns :
    a new GtkButton  


    附:信号列表
    Signals
      "activate"                                       : Action
      "clicked"                                        : Action
      "enter"                                          : Run First
      "leave"                                          : Run First
      "pressed"                                        : Run First
      "released"                                       : Run First

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?马上加入

    x
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-27 22:25:33 | 显示全部楼层
    占位,发答案
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-27 22:25:54 | 显示全部楼层
    本帖最后由 白浪 于 2013-8-29 02:33 编辑



        触发按钮(toggle button,GtkToggleButton)是GtkButton派生而来。它的外观类似GtkButton,但运行方式稍有不同。触发按钮与一种状态结合在一起。它可以按下和弹回。触发按钮的外观反映它的状态。在开始,触发按钮看上去和普通按钮一样。如果按下按钮,它就停留在下面。触发按钮需要再按一次才能弹回来。
        同普通button,我们可以用 gtk_toggle_button_new()创建不带标签的触发按钮, gtk_toggle_button_new_with_label()创建带解发的按钮。因为触发按钮是GtkButton派生而来,所以所有可以在普通Gtkbutton上用的事件和函数都可以用在触发按钮上,并且还增加了一个"toggled"(触发)信号。只要GtkToggleButton状态发生变化时都会的产生"toggled"信号。

    同普通按钮,以下代码可以生成一个toggle按钮,
    1. #include <gtk/gtk.h>

    2. void on_button_clicked(void)
    3. {
    4.     //在终端中打印
    5.     g_printf("button clicked!!!\n");
    6. }

    7. int main (void)
    8. {
    9.     GtkWidget *window = NULL;
    10.     GtkWidget *button = NULL;
    11.     // 初始化 GTK
    12.     gtk_init(NULL, NULL);
    13.     // 建立一個新的 GtkWindow
    14.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    15.     //建立一个新的button
    16.     //button = gtk_button_new ();
    17.     button = gtk_toggle_button_new_with_label ("toggle button");
    18.     // 設置標題
    19.     gtk_window_set_title (GTK_WINDOW (window), "Window");
    20.     // 設置默認大小
    21.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    22.     //将button放置到window容器中
    23.     gtk_container_add(GTK_CONTAINER(window),button);
    24.     // 處理 "destroy" 信號,當窗口被關閉時退出程序
    25.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

    26.     // 顯示窗口和所有子組件
    27.     gtk_widget_show_all (window);
    28.     // 開始事件循環
    29.     gtk_main ();
    30.     // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    31.     return 0;
    32. }
    复制代码
    如图所示:

    下面我们来做"toggled"信号的回调
    当有"toggled"信号时,我们就判断togglebutton是按下还是弹起,如果是按下,则在终端打印"button pressed!!!",如果是弹起则打印"button raised!!!",gtk_toggle_button_get_active函数是用来检测togglebutton是按下还是弹起的。
    1. #include <gtk/gtk.h>

    2. void button_toggled(GtkWidget *widget,gpointer *data)
    3. {
    4.     //在终端中打印
    5.     if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))==TRUE)
    6.     g_printf("button pressed!!!\n");
    7.     else
    8.     g_printf("button raised!!!\n");
    9. }

    10. int main (void)
    11. {
    12.     GtkWidget *window = NULL;
    13.     GtkWidget *button = NULL;
    14.     // 初始化 GTK
    15.     gtk_init(NULL, NULL);
    16.     // 建立一個新的 GtkWindow
    17.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    18.     //建立一个新的button
    19.     //button = gtk_button_new ();
    20.     button = gtk_toggle_button_new_with_label ("toggle button");
    21.     // 設置標題
    22.     gtk_window_set_title (GTK_WINDOW (window), "Window");
    23.     // 設置默認大小
    24.     gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
    25.     //将button放置到window容器中
    26.     gtk_container_add(GTK_CONTAINER(window),button);
    27.     // 處理 "destroy" 信號,當窗口被關閉時退出程序
    28.     g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    29.     g_signal_connect (button, "toggled", G_CALLBACK (button_toggled), NULL);
    30.     // 顯示窗口和所有子組件
    31.     gtk_widget_show_all (window);
    32.     // 開始事件循環
    33.     gtk_main ();
    34.     // gtk_main_quit 會導致 gtk_main 退出,於是程序結束
    35.     return 0;
    36. }
    复制代码
    如图所示:

    又到作业时间,还是英文题,阅读以下英文,并使用gtk_toggle_button_set_active ()函数对toggle button的状态进行操作。gtk_toggle_button_set_active ()void                gtk_toggle_button_set_active        (GtkToggleButton *toggle_button,                                                         gboolean is_active);Sets the status of the toggle button. Set to TRUE if you want the GtkToggleButton to be 'pressed in', and FALSE to raise it. This action causes the "toggled" signal and the "clicked" signal to be emitted. toggle_button :         a GtkToggleButton. is_active :                 TRUE or FALSE.

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?马上加入

    x
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-27 22:26:26 | 显示全部楼层
    本帖最后由 白浪 于 2013-8-29 02:33 编辑

    占位,toggle教程作业答案
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-28 00:42:29 | 显示全部楼层
    本帖最后由 白浪 于 2013-8-29 02:45 编辑

       觉得有必要讲解一下回调函数。 由于程序必须能够对用户的操作做出相应,在基于GUI的程序设计中信号是必要的。移动鼠标,按下按钮,敲入正文或者关闭窗口,将给应用软件的回呼函数提供信号。信号可能需要应用软件来加以处理。如:字处理软件 有使字体变黑的按钮。如果用户按下了按钮,就需要调用使字体变黑的程序。与此类型,如果用户关闭了主窗口,在实际关闭窗口以前要进行某些处理(如保存文 件,清除等)。
           在GTK+中经常产生各种信号,多数情况下信号被忽略。以按钮构件为例,应用软件有专门用于按钮的信号。当用户按下鼠标或释放鼠标按钮时,当用户点击鼠标时,或者当鼠标移过按钮或离开按钮时都产生各自的信号。应用程序可以忽略掉一些信号,只对感兴趣的事件加以处理。
           当需要对信号进行处理时,需要用GTK+登记回调函数,并将它和构件联系在一起。构件可以登记回调函数,回调函数可与多个构件联系在一起。
                  g_signal_connect用于登记一个GTK+信号,其功能有点像普通信号登记函数signal.当某个空间发出信号,程序就会去执行由g_signal_connect登记的回调函数。
    以下是英文说明:
    g_signal_connect()
    #define             g_signal_connect(instance, detailed_signal, c_handler, data)Connects a GCallbackfunction to a signal for a particular object.
    The handler will be called before the default handler of the signal.
    instance :
    the instance to connect to.
    detailed_signal :
    a string of the form "signal-name::detail".
    c_handler :
    the GCallback to connect.
    data :
    data to pass to c_handler calls.
    Returns :
    the handler id


  • TA的每日心情
    慵懒
    2013-7-6 15:08
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]初来乍到

    发表于 2013-8-28 21:02:45 | 显示全部楼层
    阅读一下英文……这个作业够别致啊
  • TA的每日心情
    奋斗
    2015-10-16 12:17
  • 签到天数: 401 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-28 23:26:38 | 显示全部楼层
    ekd123 发表于 2013-8-28 21:02
    阅读一下英文……这个作业够别致啊

    英文总是要阅读的,这个要培养的,习惯了就好
    *滑块验证:
    您需要登录后才可以回帖 登录 | 马上加入

    本版积分规则

    申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

    我要啦免费统计

    GMT+8, 2024-4-19 12:37 , Processed in 0.053152 second(s), 8 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表