主要是参考博文:https://blog.youkuaiyun.com/weixin_44374594/article/details/117813316
以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第54页的内容——选择按钮
在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page54.c -o page54 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page54
/* the example on page 54 */
#include <gtk/gtk.h>
gint Delete (GtkWidget *widget, gpointer gdata)
{
gtk_main_quit ();
return (FALSE);
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *box;
GtkWidget *label;
GtkWidget *radio_button_kde;
GtkWidget *radio_button_gnome;
GtkWidget *radio_button_xfce;
GtkWidget *radio_button_icewm;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "radio_button");
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (Delete), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 100);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
label = gtk_label_new ("Linux桌面选择,只能选择一个");
gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
gtk_widget_show (label);
radio_button_kde = gtk_radio_button_new_with_label (NULL, "KDE");
gtk_box_pack_start (GTK_BOX(box), radio_button_kde, FALSE, FALSE, 0);
gtk_widget_show (radio_button_kde);
radio_button_gnome = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_button_kde), "GNOME");
gtk_box_pack_start (GTK_BOX(box), radio_button_gnome, FALSE, FALSE, 0);
gtk_widget_show (radio_button_gnome);
radio_button_xfce = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_button_kde), "xfce");
gtk_box_pack_start (GTK_BOX(box), radio_button_xfce, FALSE, FALSE, 0);
gtk_widget_show (radio_button_xfce);
radio_button_icewm = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_button_kde), "IceWM");
gtk_box_pack_start (GTK_BOX(box), radio_button_icewm, FALSE, FALSE, 0);
gtk_widget_show (radio_button_icewm);
gtk_container_add (GTK_CONTAINER(window), box);
gtk_widget_show (box);
gtk_widget_show (window);
gtk_main ();
return 0;
}
其实原书中的写法,就是使用GSList和gtk_radio_button_get_group实现的,每个新建按钮都使用group值,并且每次使用gtk_radio_button_get_group将group值设置与第一个按钮radio_button_kde的group的值一样
/* the example on page 542 */
#include <gtk/gtk.h>
gint Delete (GtkWidget *widget, gpointer gdata)
{
gtk_main_quit ();
return (FALSE);
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *box;
GtkWidget *label;
GtkWidget *radio_button_kde;
GtkWidget *radio_button_gnome;
GtkWidget *radio_button_xfce;
GtkWidget *radio_button_icewm;
GSList *group = NULL;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "radio_button");
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (Delete), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 100);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
label = gtk_label_new ("Linux桌面选择,只能选择一个");
gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
gtk_widget_show (label);
radio_button_kde = gtk_radio_button_new_with_label (group, "KDE");
gtk_box_pack_start (GTK_BOX(box), radio_button_kde, FALSE, FALSE, 0);
gtk_widget_show (radio_button_kde);
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));
radio_button_gnome = gtk_radio_button_new_with_label (group, "GNOME");
gtk_box_pack_start (GTK_BOX(box), radio_button_gnome, FALSE, FALSE, 0);
gtk_widget_show (radio_button_gnome);
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));
radio_button_xfce = gtk_radio_button_new_with_label (group, "xfce");
gtk_box_pack_start (GTK_BOX(box), radio_button_xfce, FALSE, FALSE, 0);
gtk_widget_show (radio_button_xfce);
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));
radio_button_icewm = gtk_radio_button_new_with_label (group, "IceWM");
gtk_box_pack_start (GTK_BOX(box), radio_button_icewm, FALSE, FALSE, 0);
gtk_widget_show (radio_button_icewm);
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));
gtk_container_add (GTK_CONTAINER(window), box);
gtk_widget_show (box);
gtk_widget_show (window);
gtk_main ();
return 0;
}
效果图如下