Закрыть окно GTK

0

Потерпите меня, поскольку я очень новичок в GTK и GDK.

Я пытаюсь выполнить несколько изображений, внести изменения в них (нарисуйте круг в разных точках) и сделайте ввод данных пользователем из stdin.

Я написал классы C++, чтобы обернуть вокруг рамки GTK, чтобы упростить манипуляции с изображениями. В настоящее время я открываю отдельные окна с каждым изображением, запрашивая ввод, закрывая это окно, а затем открывая следующий.

Я могу сделать все просто отлично, за исключением того, что окно закрывается программным образом, а пользователь делает это неприемлемо (т.е. Слишком утомительно). Ниже приведен код, который открывает и закрывает окно.

void PixelImage::show() {
  gtk_widget_show_all(this->window);
  gtk_main();
}

void PixelImage::close() {
  gtk_window_close((GtkWindow*)this->window);
}

PixelImage::PixelImage(const char *fname) {
  this->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(this->window, "destroy",
                   G_CALLBACK (gtk_main_quit), NULL);

  this->fname = std::string(fname);
  this->image = gtk_image_new_from_file(fname);
  this->pix = gtk_image_get_pixbuf((GtkImage*)this->image);
  this->pixels = gdk_pixbuf_get_pixels(this->pix);
  this->len = gdk_pixbuf_get_byte_length(this->pix);

  this->width  = gdk_pixbuf_get_width(this->pix);
  this->height = gdk_pixbuf_get_height(this->pix);
  this->nchannels = gdk_pixbuf_get_n_channels(this->pix);
  this->rowstride = gdk_pixbuf_get_rowstride(this->pix);

  gtk_container_add(GTK_CONTAINER (this->window), this->image);
}

Когда close вызывается после show, окно остается, и когда я его закрываю, появляется следующая ошибка.

(img: 2173): Gtk-CRITICAL **: gtk_widget_get_realized: утверждение "GTK_IS_WIDGET (виджет)" не выполнено

Теги:
image-processing
gtk
gdk

1 ответ

0

Поэтому я собираюсь ответить на собственный вопрос. Возможно, есть лучший способ, который я хотел бы услышать, но так я его и решил.

Я использовал POSIX Threads, где я открываю поток, который открывает окно изображения, а затем выполняет другие действия в основном потоке. Затем я просто вызываю gtk_main_quit() из основного потока. Затем я присоединяюсь к резьбе оконного подшипника. Вот код.

static void* gtkStarter(void * a) {
  gtk_main();
  return NULL;
}

void PixelImage::show() {
  gtk_widget_show_all(this->window);
  pthread_create(&this->pp, NULL, gtkStarter, NULL);
}

void PixelImage::close() {
  gtk_main_quit();
  pthread_join(this->pp, NULL);
}

Кажется, это работает очень хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню