LINUX.ORG.RU

gtk_widget_show и gtk_widget_show_all

 


0

2

Нормально ли что при таком коде всё отображается нормально:

#include <gtk-2.0/gtk/gtk.h>

int main(void)
{
	GtkWidget *window, *button1, *button2;
	gtk_init(0, 0);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_widget_show(window);

	button1 = gtk_button_new();
	gtk_container_add(GTK_CONTAINER(window), button1);
	gtk_container_set_border_width(GTK_CONTAINER(button1), 50);
	gtk_widget_show(button1);

	button2 = gtk_button_new();
	gtk_container_add(GTK_CONTAINER(button1), button2);
	gtk_container_set_border_width(GTK_CONTAINER(button2), 50);
	gtk_widget_show(button2);

	gtk_main();

	return 0;
}

А при таком криво:

#include <gtk-2.0/gtk/gtk.h>

int main(void)
{
	GtkWidget *window, *button1, *button2;

	gtk_init(0, 0);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_widget_show(window);

	button1 = gtk_button_new();
	gtk_container_add(GTK_CONTAINER(window), button1);
	gtk_container_set_border_width(GTK_CONTAINER(button1), 50);

	button2 = gtk_button_new();
	gtk_container_add(GTK_CONTAINER(button1), button2);
	gtk_container_set_border_width(GTK_CONTAINER(button2), 50);

	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}

?

Кривота заключается в том, что при клике на button2 нажимается button1, а button2 как будто и нет вовсе.

Ответ на: комментарий от backbone

Имелось в виду gtk_container_add(GTK_CONTAINER(window), button2);

В window только один дочерний виджет можно добавить.

anonymous
()

А зачем ты кнопку в кнопку добавляешь? show/show_all тут в поведении абсолютно ни при делах.

ykroop
()
Ответ на: комментарий от ykroop

А зачем ты кнопку в кнопку добавляешь?

Я только начал трогать GTK, и это первое что пришло в голову. Сделал две кнопки с поочередным gtk_widget_show — всё работало правильно. Но потом решил попробовать gtk_widget_show_all, он удобнее, а там работает криво, вот и интересно стало кто виноват.

show/show_all тут в поведении абсолютно ни при делах.

Значит виноват gtk2.

perdperdperd
() автор топика
Ответ на: комментарий от perdperdperd

В GTK+ 3-ем то же самое примерно. Glade пишет «Widgets of type Button need placeholders to add children» или «Виджетам типа Кнопка нужен заполнитель для добавления дочерних элементов».

backbone ★★★★★
()
Ответ на: комментарий от perdperdperd

В gtk3 тоже самое. Причём , чтобы работало, нужно обеспечить порядок следования функций gtk_widget_show так, чтобы gtk_widget_show(button2) была последней.

Так тоже работает:

#include <gtk/gtk.h>

int main(void)
{
	GtkWidget *window, *button1, *button2;

	gtk_init(0, 0);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	button1 = gtk_button_new();
	button2 = gtk_button_new();

	gtk_container_add(GTK_CONTAINER(button1), button2);
	gtk_container_add(GTK_CONTAINER(window),  button1);

	gtk_container_set_border_width(GTK_CONTAINER(button1), 50);
	gtk_container_set_border_width(GTK_CONTAINER(button2), 50);

	gtk_widget_show_all(window);
	gtk_widget_hide(button2);
	gtk_widget_show(button2);

	gtk_main();

	return 0;
}

nvl ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.