请耐心等待我,因为我是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)'失败
答案 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);
}
它看起来效果很好。