c++ - 关闭 GTK 窗口

标签 c++ c image-processing gtk gdk

请耐心等待,因为我对 GTK 和 GDK 非常陌生。

我正在尝试循环浏览多个图像,对它们进行修改(在各个点画一个圆圈),并从标准输入获取用户输入。

我编写了 C++ 类来封装 GTK 框架,这样我就可以简化图像操作。我目前正在为每个图像打开单独的窗口,请求输入,关闭该窗口,然后打开下一个窗口。

除了以编程方式关闭窗口之外,我可以做所有事情,并且让用户这样做是 Not Acceptable (即太乏味)。下面是打开和关闭窗口的代码。

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: assertion 'GTK_IS_WIDGET (widget)' failed

最佳答案

所以我要回答我自己的问题。也许有更好的方法,我很想听,但这就是我解决它的方法。

我使用 POSIX 线程,打开一个线程来打开图像窗口,然后在主线程上执行其他操作。然后我简单地从主线程调用 gtk_main_quit() 。然后我用 window 轴承线程连接。这是代码。

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);
}

看起来效果不错。

关于c++ - 关闭 GTK 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825500/

相关文章:

c++ - 使用 atoi 将 *argv[] 转换为 int

c++ - Qt5.2 NetworkManager::networkInterfaces()

c - C 中的图形函数

Java:使用AffineTransform缩放图像时出现线条

java - 将图像和视频文件从 android 发送到服务器并接收处理

c# - C++ 和 C# 可以用于 iPhone 应用程序吗

c++ - 如何使用 LUA_COMPAT_ALL?

c# - 在 C# 上用 union 声明 C 结构

C++:将 LPTSTR 转换为字符数组

image-processing - 在多模态灰度图像上检测模糊矩形