crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Ошибка в простой программе GTK
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Гость Дата 5.4.2023, 16:15
 
Цитата(tumanovalex @ 21.5.2020, 0:38) *
При запуске в терминальном (консольном) режиме появляется ошибка "(cbGtkStudyWin.exe:1644): Gtk-CRITICAL **: gtk_box_reorder_child: assertion `GTK_IS_WIDGET (child)' failed". Просмотрел весь код несколько раз, но так и не понял, из-за чего возникает ошибка. Помогите, пожалуйста, разобраться

У меня похожая программа, правда под Linux. Файл colorbuttons.c:
#include <gtk/gtk.h>

static void destroy (GtkWidget*, gpointer);
static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer);
static void color_changed(GtkColorButton*, GtkWidget*);

int main(int argc, char *argv[]) {
  GtkWidget *window, *button, *label, *hbox;
  GdkRGBA color;
  
  gtk_init(&argc, &argv);

  window= gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Color Button");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  /* Set the initial color as #003366 and set the dialog title. */
  gdk_rgba_parse(&color, "#003366");

  button= gtk_color_button_new_with_rgba(&color);
  gtk_color_button_set_title(GTK_COLOR_BUTTON(button), "Peek a Color");

  label= gtk_label_new("Look at my color!");

  color_changed(GTK_COLOR_BUTTON(button), label);

  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
  g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event),
           NULL);

  g_signal_connect(G_OBJECT(button), "color_set",
             G_CALLBACK(color_changed),
             (gpointer)label);

  hbox= gtk_box_new(FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
  gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);

  gtk_container_add(GTK_CONTAINER(window), hbox);
  gtk_widget_show_all(window);

  gtk_main();
  return 0;
}

/* Retrieve the selected color and set it as the GtkLabel's foreground color. */
static void color_changed(GtkColorButton *button, GtkWidget *label) {
  GdkRGBA color;

  gtk_color_chooser_get_rgba((GtkColorChooser*) button, &color);

  GtkCssProvider *css_provider= gtk_css_provider_new();

  GString *css_gstring= g_string_new("");
  g_string_printf(css_gstring,
          "* { background-image:none; "
          "background-color:%s; }",
          gdk_rgba_to_string(&color));

  gtk_css_provider_load_from_data(css_provider,
                  css_gstring->str,
                  -1, NULL);
  
  
  GtkStyleContext *context= gtk_widget_get_style_context(label);
  gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(css_provider),
                 GTK_STYLE_PROVIDER_PRIORITY_USER);
  g_object_unref(css_provider);
  g_string_free(css_gstring, TRUE);
}

/* Stop the GTK+ main loop function when the window is destroyed. */
static void destroy(GtkWidget *window, gpointer data) {
  if (window && data == NULL) {
    gtk_main_quit();
  }
}

/* Return FALSE to destroy the widget. By returning TRUE, you can cancel
   a delete-event. This can be used to confirm quitting the application. */
static gboolean delete_event(GtkWidget *window, GdkEvent *event,
                 gpointer data) {
  if (window && event && data) {
    return FALSE;
  }
  return FALSE;
}
Makefile:
source = colorbuttons.c
all: program

program: $(source)
    gcc -g $(source) -o $@ \
    `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0`

clean:
    rm program
Работает, ошибок не выдаёт.
tumanovalex Дата 21.5.2020, 0:38
  Windows 10 Home 64 bit, CodeBlocks 20.03. Программа
#include <gtk/gtk.h>

static void destroy (GtkWidget*, gpointer);
static void color_changed (GtkColorButton*, GtkWidget*);

int main (int argc, char *argv[])
{
  GtkWidget *window, *button, *label, *hbox;

  GdkRGBA rgba;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Color Button");
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);

  rgba.alpha = 0.0; rgba.blue = 0.0; rgba.green = 0.0; rgba.red = 0.0;
  button = gtk_color_button_new_with_rgba(&rgba);
  label = gtk_label_new ("Look at my color!");
  gtk_widget_override_color(label, GTK_STATE_NORMAL, &rgba);

  g_signal_connect (G_OBJECT (button), "color_set", G_CALLBACK (color_changed), (gpointer) label);

  hbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
  gtk_box_pack_start(GTK_BOX (hbox), button, FALSE , TRUE , 5);
  gtk_box_pack_start(GTK_BOX (hbox), label, FALSE , TRUE , 5);

  gtk_container_add (GTK_CONTAINER (window), hbox);

  gtk_widget_show_all (window);

  gtk_main ();
  return 0;
}

static void color_changed (GtkColorButton *button, GtkWidget *label)
{
  GdkRGBA rgba;
  gtk_color_chooser_get_rgba((GtkColorChooser*) button, &rgba);
  gtk_widget_override_color(label, GTK_STATE_NORMAL, &rgba);
}

static void destroy (GtkWidget *window,          gpointer data)
{
  gtk_main_quit ();
}
При запуске в терминальном (консольном) режиме появляется ошибка "(cbGtkStudyWin.exe:1644): Gtk-CRITICAL **: gtk_box_reorder_child: assertion `GTK_IS_WIDGET (child)' failed". Просмотрел весь код несколько раз, но так и не понял, из-за чего возникает ошибка. Помогите, пожалуйста, разобраться
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 3:11