在Linux

时间:2017-03-16 21:03:49

标签: linux gtk

我编写了一个简单的代码,使用gtk:

在窗口中显示原始图像缓冲区
#include <gtk/gtk.h>

int main (int argc, char *argv[])
{
    const int Width = 1920, Height = 1080;
    char *buffer = (char*)malloc(3 * Width * Height);

    // Read a raw image data from the disk and put it in the buffer.
    // ....

    GtkWidget *window;
    GtkWidget* image;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB,
        FALSE, 8, Width, Height, Width*3, NULL, NULL);

    gtk_window_set_title (GTK_WINDOW (window), "Image Viewer");

    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

    image = gtk_image_new_from_pixbuf (pixbuf);
    gtk_container_add(GTK_CONTAINER (window), image);

    gtk_widget_show_all (window);

    gtk_main ();

    free (buffer);
    return 0;
}

如何更改此代码以显示像电影一样的N图像序列(即连续播放,而不是使用图像对话框手动选择图像)?主显示循环由gtk_main()控制,当用户关闭窗口时结束。我认为将图像分配给图像小工具的循环应该在图像小工具的事件处理程序中,但我不知道该事件处理程序。

1 个答案:

答案 0 :(得分:0)

事实上,这个 是微不足道的;)。

你需要明白,一旦你打电话给gtk_main,一切都由GLib&#34;主循环&#34;来决定,这是一个类似于几乎所有GUI工具包的事件循环。然后GTK将对收到的事件做出反应。

所以你需要一种方法来创建这些事件。例如,如果您想要定期执行操作(此处的操作是&#34;显示新图片&#34;),您只需拨打g_timeout_add并向其传递一个回调,以便每秒拨打一次例。使用user_data参数将指针传递给您可以轻松找到GtkImage的结构以及要显示的图像列表。在回调中,您只需更改显示的图像,最有可能使用gtk_image_set_from_pixbuf

g_timeout_add_secondsg_timeout_add做同样的事情,但精度较低(秒而不是毫秒),但它具有更加电池友好的优点(减少CPU唤醒=节省更多能量)。

您可能还希望以与计时器不同的方式触发操作。为此你有g_idle_add,它会在程序空闲时调用你的回调(没有要处理的事件)。

GLib main event loop的文档中阅读这些功能的文档。