2.2 按钮
本帖最后由 白浪 于 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程序中要放在容器里面才可以显示出来,从上节我们可以看得出来窗口是最基本的容器,所以我们可以把按钮放到窗口中再显示。
如上图中,在窗口里面有一个巨大的按钮,可以照如下代码编程:#include <gtk/gtk.h>
int main (void)
{
GtkWidget *window = NULL;
GtkWidget *button = NULL;
// 初始化 GTK
gtk_init(NULL, NULL);
// 建立一個新的 GtkWindow
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//建立一个新的button
button = gtk_button_new ();
// 設置標題
gtk_window_set_title (GTK_WINDOW (window), "Window");
// 設置默認大小
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
//将button放置到window容器中
gtk_container_add(GTK_CONTAINER(window),button);
// 處理 "destroy" 信號,當窗口被關閉時退出程序
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
// 顯示窗口和所有子組件
gtk_widget_show_all (window);
// 開始事件循環
gtk_main ();
// gtk_main_quit 會導致 gtk_main 退出,於是程序結束
return 0;
}
有的童鞋就会问了,为什么按钮上没有字啊,其实我们可以用button = gtk_button_new_with_label ("button")来创建按钮,如下图所示
下面我们来做button的简单回调,当button被按下时,我们在终端打印出"button clicked!"#include <gtk/gtk.h>
void on_button_clicked(void)
{
//在终端中打印
g_printf("button clicked!!!\n");
}
int main (void)
{
GtkWidget *window = NULL;
GtkWidget *button = NULL;
// 初始化 GTK
gtk_init(NULL, NULL);
// 建立一個新的 GtkWindow
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//建立一个新的button
//button = gtk_button_new ();
button = gtk_button_new_with_label ("button");
// 設置標題
gtk_window_set_title (GTK_WINDOW (window), "Window");
// 設置默認大小
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
//将button放置到window容器中
gtk_container_add(GTK_CONTAINER(window),button);
// 處理 "destroy" 信號,當窗口被關閉時退出程序
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), NULL);
// 顯示窗口和所有子組件
gtk_widget_show_all (window);
// 開始事件循環
gtk_main ();
// gtk_main_quit 會導致 gtk_main 退出,於是程序結束
return 0;
}
如图所示:
本节教程到此休息一下,本节作业,阅读以下英文,并用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
占位,发答案 本帖最后由 白浪 于 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按钮,#include <gtk/gtk.h>
void on_button_clicked(void)
{
//在终端中打印
g_printf("button clicked!!!\n");
}
int main (void)
{
GtkWidget *window = NULL;
GtkWidget *button = NULL;
// 初始化 GTK
gtk_init(NULL, NULL);
// 建立一個新的 GtkWindow
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//建立一个新的button
//button = gtk_button_new ();
button = gtk_toggle_button_new_with_label ("toggle button");
// 設置標題
gtk_window_set_title (GTK_WINDOW (window), "Window");
// 設置默認大小
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
//将button放置到window容器中
gtk_container_add(GTK_CONTAINER(window),button);
// 處理 "destroy" 信號,當窗口被關閉時退出程序
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
// 顯示窗口和所有子組件
gtk_widget_show_all (window);
// 開始事件循環
gtk_main ();
// gtk_main_quit 會導致 gtk_main 退出,於是程序結束
return 0;
}
如图所示:
下面我们来做"toggled"信号的回调当有"toggled"信号时,我们就判断togglebutton是按下还是弹起,如果是按下,则在终端打印"button pressed!!!",如果是弹起则打印"button raised!!!",gtk_toggle_button_get_active函数是用来检测togglebutton是按下还是弹起的。#include <gtk/gtk.h>
void button_toggled(GtkWidget *widget,gpointer *data)
{
//在终端中打印
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))==TRUE)
g_printf("button pressed!!!\n");
else
g_printf("button raised!!!\n");
}
int main (void)
{
GtkWidget *window = NULL;
GtkWidget *button = NULL;
// 初始化 GTK
gtk_init(NULL, NULL);
// 建立一個新的 GtkWindow
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//建立一个新的button
//button = gtk_button_new ();
button = gtk_toggle_button_new_with_label ("toggle button");
// 設置標題
gtk_window_set_title (GTK_WINDOW (window), "Window");
// 設置默認大小
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
//将button放置到window容器中
gtk_container_add(GTK_CONTAINER(window),button);
// 處理 "destroy" 信號,當窗口被關閉時退出程序
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (button, "toggled", G_CALLBACK (button_toggled), NULL);
// 顯示窗口和所有子組件
gtk_widget_show_all (window);
// 開始事件循環
gtk_main ();
// gtk_main_quit 會導致 gtk_main 退出,於是程序結束
return 0;
}
如图所示:
又到作业时间,还是英文题,阅读以下英文,并使用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.
本帖最后由 白浪 于 2013-8-29 02:33 编辑
占位,toggle教程作业答案 本帖最后由 白浪 于 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
再占一楼 阅读一下英文……这个作业够别致啊 :lol ekd123 发表于 2013-8-28 21:02
阅读一下英文……这个作业够别致啊
英文总是要阅读的,这个要培养的,习惯了就好
页:
[1]