请耐心等待,因为我对 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/