Потерпите меня, поскольку я очень новичок в 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 (виджет)" не выполнено
Поэтому я собираюсь ответить на собственный вопрос. Возможно, есть лучший способ, который я хотел бы услышать, но так я его и решил.
Я использовал 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);
}
Кажется, это работает очень хорошо.