关闭GTK窗口

时间:2014-11-09 06:03:25

标签: c++ c image-processing gtk gdk

请耐心等待我,因为我是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);
}

在show之后调用close时,窗口会保留,当我关闭它时,会出现以下错误。

  

(img:2173):Gtk-CRITICAL **:gtk_widget_get_realized:断言'GTK_IS_WIDGET(widget)'失败

1 个答案:

答案 0 :(得分: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);
}

它看起来效果很好。