GtkRadioButton的学习记录

📖 GtkRadioButton的GTK3官网详细界面

// demo1.c
#include <gtk/gtk.h>

static void load_css(void);
static GtkWidget *create_window(const gint, const gint);
static GtkWidget *createGrid(guint, gboolean, gboolean, guint, guint);

int main(int argc, char *argv[])
{
	gtk_init(&argc, &argv);
	load_css();

	GtkWidget *window;
	GtkWidget *grid;
	GtkWidget *radioButoon;
	GtkWidget *radioButoon1;
	GtkWidget *radioButoon2;

	window = create_window(200, 200);
	grid = createGrid(3, FALSE, FALSE, 3, 3);
	gtk_container_add(GTK_CONTAINER(window), grid);

	/// demo1.c主要使用三个以下三个函数进行创建对象
	radioButoon = gtk_radio_button_new(NULL);
	/// 带标签
	radioButoon1 = gtk_radio_button_new_with_label(NULL, "Click the button");
	/// 带标签,当我们按下Alt + 前面带有'_'的字母,即可激活按钮
	radioButoon2 = gtk_radio_button_new_with_mnemonic(NULL, "_Click the button");
	gtk_grid_attach(GTK_GRID(grid), radioButoon, 0, 0, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), radioButoon1, 0, 1, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), radioButoon2, 0, 2, 1, 1);

	gtk_widget_show_all(window);
	gtk_main();
}

static GtkWidget *create_window(const gint w, const gint h)
{
	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	gtk_window_set_default_size(GTK_WINDOW(window), w, h);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_title(GTK_WINDOW(window), "Hello GTK3");
	gtk_container_set_border_width(GTK_CONTAINER(window), 50);

	return window;
}

static void load_css(void)
{
	GtkCssProvider *provider;
	GdkDisplay *display;
	GdkScreen *screen;

	const char *css_style_file = "style.css";
	GFile *css_fp = g_file_new_for_path(css_style_file);
	GError *error = 0;

	provider = gtk_css_provider_new();
	display = gdk_display_get_default();
	screen = gdk_display_get_default_screen(display);

	gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
	gtk_css_provider_load_from_file(provider, css_fp, &error);

	g_object_unref(provider);
}

static GtkWidget *createGrid(guint border,
			     gboolean row_homogeneous,
			     gboolean column_homogeneous,
			     guint row_spacing,
			     guint column_spacing)
{
	GtkWidget *grid = gtk_grid_new();
	gtk_grid_set_row_homogeneous(GTK_GRID(grid), row_homogeneous);
	gtk_grid_set_column_homogeneous(GTK_GRID(grid), column_homogeneous);
	gtk_grid_set_row_spacing(GTK_GRID(grid), row_spacing);
	gtk_grid_set_column_spacing(GTK_GRID(grid), column_spacing);
	gtk_container_set_border_width(GTK_CONTAINER(grid), border);
	g_object_set(grid,
		     "tooltip-text", "Grid",
		     NULL);

	return grid;
}
window {
	background-color: green;
}

grid {
	background-color: orange;
}

radiobutton {
	background-color:white;
}
  • 运行效果:
    在这里插入图片描述

这里值讨论如何创建出radiobutton对象,demo1.c使用了三种方法。这样创建三个radiobutton,并且都属于同一个group,那么这些单选按钮只能选择自己了,没有别的选项,那么接下来,demo2.c将来介绍如何创建属于同一个组的多个radiobutton,使得我们可以在这些radiobutton中可以选择自己想要的选项,我们选C。


// demo2.c
// 这里会去除重复的功能函数代码
int main(int argc, char *argv[])
{
	gtk_init(&argc, &argv);
	load_css();

	GtkWidget *window;
	GtkWidget *grid;
	GtkWidget *radio_butoon;
	GtkWidget *new_radio_button;
	GtkWidget *new_radio_button2;
	GtkWidget *new_radio_button3;

	/// ***创建一个窗口
	window = create_window(400, 350);
	/// ***创建一个网格
	grid = createGrid(3, FALSE, FALSE, 3, 3);
	gtk_container_add(GTK_CONTAINER(window), grid);
	/// ***创建一个单选按钮 Alt + b 选中这个radiobutton
	radio_butoon = gtk_radio_button_new_with_mnemonic(NULL, "_B");
	gtk_grid_attach(GTK_GRID(grid), radio_butoon, 0, 1, 1, 1);
	/// ***
	new_radio_button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_butoon), "A");
	new_radio_button2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_butoon), "C");
	new_radio_button3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_butoon), "D");
	gtk_grid_attach(GTK_GRID(grid), new_radio_button, 0, 0, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button2, 0, 2, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button3, 0, 3, 1, 1);

	gtk_widget_show_all(window);
	gtk_main();
}
  • 运行效果

在这里插入图片描述

现在A、B、C、D为一个组了,可以随意选中一个想要的选项,我们选C,并且我们按下Alt + b会选中B,这是创建对象时使用了demo1.c中的第三个函数。创建同一组的radiobutton还有跟demo1.c一样的创建方式,三个函数一一对应,这里就不举出来了,很容易可以类比出来。


// demo3.c
// 将使用以下三个函数 函数名和功能浅显易懂
void gtk_radio_button_set_group ()
GSList*	gtk_radio_button_get_group ()
void gtk_radio_button_join_group ()
// get_group    set_group
	GtkWidget *radio_butoon;
	GtkWidget *new_radio_button;
	GtkWidget *new_radio_button2;
	GtkWidget *new_radio_button3;
	GSList *group;

	radio_butoon = gtk_radio_button_new_with_mnemonic(NULL, "A");
	gtk_grid_attach(GTK_GRID(grid), radio_butoon, 0, 0, 1, 1);
	/// ***
	/// ***
	new_radio_button = gtk_radio_button_new_with_mnemonic(NULL, "_B");
	new_radio_button2 = gtk_radio_button_new_with_label(NULL, "C");
	new_radio_button3 = gtk_radio_button_new_with_label(NULL, "D");
	group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_butoon));
	gtk_radio_button_set_group(GTK_RADIO_BUTTON(new_radio_button), group);
	group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_butoon));
	gtk_radio_button_set_group(GTK_RADIO_BUTTON(new_radio_button2), group);
	group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_butoon));
	gtk_radio_button_set_group(GTK_RADIO_BUTTON(new_radio_button3), group);

	gtk_grid_attach(GTK_GRID(grid), new_radio_button, 0, 1, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button2, 0, 2, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button3, 0, 3, 1, 1);
  • 运行效果

在这里插入图片描述

使用set_group函数的时需要注意的是,每次在我们往group里添加一个新的radiobutton的时候,GSList都会发生变化,意思就是,如果我们再想添加一个新的radiobutton到这个组并且是关联到之前的radiobutton,必须要重新获取GSList,不然会发生这些选项不是单一的,也就是这里面有多个group。
比如我们一开始创建A,然后获取A的group的GSList,然后把B使用函数set_group添加到group去,这时A、B就在同一组了;当现在我们想把C添加这个A、B的组里面的时候,要是我们使用的GSList是之前那个,那么这个C只会与A组成一个新的group,不会关联到B。要想组成A、B、C这样一个group,那么需要在添加完B后,重新获取GSList,然后把C使用函数set_group添加到这个GSList去即可,具体看代码。

// join_group
	radio_butoon = gtk_radio_button_new_with_mnemonic(NULL, "A");
	gtk_grid_attach(GTK_GRID(grid), radio_butoon, 0, 0, 1, 1);
	/// ***
	/// ***
	new_radio_button = gtk_radio_button_new_with_mnemonic(NULL, "_B");
	new_radio_button2 = gtk_radio_button_new_with_label(NULL, "C");
	new_radio_button3 = gtk_radio_button_new_with_label(NULL, "D");

	gtk_radio_button_join_group(GTK_RADIO_BUTTON(new_radio_button), GTK_RADIO_BUTTON(radio_butoon));
	gtk_radio_button_join_group(GTK_RADIO_BUTTON(new_radio_button2), GTK_RADIO_BUTTON(radio_butoon));
	gtk_radio_button_join_group(GTK_RADIO_BUTTON(new_radio_button3), GTK_RADIO_BUTTON(radio_butoon));

	gtk_grid_attach(GTK_GRID(grid), new_radio_button, 0, 1, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button2, 0, 2, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button3, 0, 3, 1, 1);
  • 运行效果
    在这里插入图片描述

使用join_group函数就不会有什么问题,很容易。


链接css文件的使用,使用的选择器名称为radiobutton。还有的其他的方法就不去学了。

// g_object_set()之前学习过这个函数,设置对象的属性,
// 可以使用这个函数来将多个radiobutton设置为一个group
	g_object_set(new_radio_button, "group", radio_butoon, NULL);
	g_object_set(new_radio_button2, "group", radio_butoon, NULL);
	g_object_set(new_radio_button3, "group", radio_butoon, NULL);

替换下代码即可实现与之前一样的效果。


接下来学习一下radioButoon的相关信号。

void toggled_cb(GtkRadioButton *radio_button)
{
	static gint flag = 1;
	GSList *group = gtk_radio_button_get_group(radio_button);
	while (group != NULL)
	{
		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data)) && group->data == radio_button)
		{
			g_print("Radio Button %d is active\n", flag);
			break;
		}
		++flag;
		group = group->next;
	}
	flag = 1;
}

int main(int argc, char *argv[])
{
	gtk_init(&argc, &argv);
	load_css();

	GtkWidget *window;
	GtkWidget *grid;
	GtkWidget *radio_butoon;
	GtkWidget *new_radio_button;
	GtkWidget *new_radio_button2;
	GtkWidget *new_radio_button3;

	/// ***创建一个窗口
	window = create_window(400, 350);
	/// ***创建一个网格
	grid = createGrid(3, FALSE, FALSE, 3, 3);
	gtk_container_add(GTK_CONTAINER(window), grid);
	/// ***
	radio_butoon = gtk_radio_button_new_with_mnemonic(NULL, "A");
	gtk_grid_attach(GTK_GRID(grid), radio_butoon, 0, 0, 1, 1);
	/// ***
	/// ***
	new_radio_button = gtk_radio_button_new_with_mnemonic(NULL, "_B");
	new_radio_button2 = gtk_radio_button_new_with_label(NULL, "C");
	new_radio_button3 = gtk_radio_button_new_with_label(NULL, "D");

	g_object_set(new_radio_button, "group", radio_butoon, NULL);
	g_object_set(new_radio_button2, "group", radio_butoon, NULL);
	g_object_set(new_radio_button3, "group", radio_butoon, NULL);

	gtk_grid_attach(GTK_GRID(grid), new_radio_button, 0, 1, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button2, 0, 2, 1, 1);
	gtk_grid_attach(GTK_GRID(grid), new_radio_button3, 0, 3, 1, 1);

	/// signals
	g_signal_connect_swapped(radio_butoon, "toggled", G_CALLBACK(toggled_cb), radio_butoon);
	g_signal_connect_swapped(new_radio_button, "toggled", G_CALLBACK(toggled_cb), new_radio_button);
	g_signal_connect_swapped(new_radio_button2, "toggled", G_CALLBACK(toggled_cb), new_radio_button2);
	g_signal_connect_swapped(new_radio_button3, "toggled", G_CALLBACK(toggled_cb), new_radio_button3);

	gtk_widget_show_all(window);
	gtk_main();
}
  • 运行结果
    在这里插入图片描述

当我们选中别的radiobutton的时候会触发toggled信号,截图的结果是我从D、C、B、A顺序点击后的结果,然后结合我们将B、C、D添加到group的顺序,可知插入到GSList中使用的方法是头插法。

先记录这些了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值