【问题标题】:gtk beginner app won't work with assertion failgtk 初学者应用程序不适用于断言失败
【发布时间】:2009-11-17 12:25:54
【问题描述】:

我在 Gtk 中做了这个简单的应用程序,只是为了测试一下......我来自摇摆,所以重新定义一个绘图事件函数对我来说很正常......无论如何似乎不起作用:

#include <gtk-2.0/gtk/gtk.h>
#include <gtk-2.0/gdk-pixbuf/gdk-pixbuf.h>
#include <stdlib.h>
#include<string.h>
#include<stdio.h>
#include <iostream>

GdkPixbuf *imm;

void destroy(GtkWidget *widget, gpointer data) {
    gtk_main_quit();
}

gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event,
        gpointer data) {
    gdk_draw_pixbuf((GdkDrawable*) widget, widget->style->white_gc, imm, 0, 0,
            0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
    return FALSE;
}

int main(int argc, char** argv) {

    char* filename = new char[1000];
    GError *error = NULL;
    GtkWidget *window;

    gtk_set_locale();
    gtk_init(&argc, &argv);

    if (argv[1] == NULL) {
        std::cout << "Err.";
        return -1;
    }

    strcpy(filename, argv[1]);

    imm = gdk_pixbuf_new_from_file(filename, &error);

    if (!imm) {
        std::cout << "err closing";
        return 0;
    }

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request((GtkWidget*) window, 500, 350);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
    g_signal_connect(window, "expose-event",
            G_CALLBACK(on_expose_event), NULL);

    gtk_container_set_border_width(GTK_CONTAINER (window), 10);
    gtk_widget_show(window);
    gtk_main();

    return 0;
}

..事实上在 runtinme 说(在线 gdk_draw_pixbuf(....)):

(cConvolve:5011): Gdk-CRITICAL **: gdk_draw_pixbuf: assertion `GDK_IS_DRAWABLE (drawable)' failed

是不是因为pixbuf不好???还是因为我不能像这样画到窗口?

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    这是因为您将GtkWidget 转换为GdkDrawable,而GtkWidget 没有从GdkDrawable 继承。使用

    gdk_draw_pixbuf(GDK_DRAWABLE(gtk_widget_get_window(widget)), blah blah...);
    

    无论如何,在普通 GTK 使用中,您不必在暴露处理程序中进行任何绘图。要显示图像,只需使用 GtkImage 小部件:

    GtkImage *image = gtk_image_new_from_file(filename);
    gtk_container_add(GTK_CONTAINER(window), image);
    

    【讨论】:

      【解决方案2】:

      小部件不inherit fromGdkDrawable,你需要从小部件的窗口中获取drawable。

      【讨论】:

        【解决方案3】:

        谢谢。但我的目的是尝试在窗口 bg 上绘图......无论如何,即使我不再得到断言,它也不起作用:

        gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event,
                gpointer data) {
            int w, h;
            w = gdk_pixbuf_get_width(imm);
            h = gdk_pixbuf_get_height(imm);
        
            gdk_draw_pixbuf((GdkDrawable*) widget->window, widget->style->fg_gc[ GTK_STATE_NORMAL ], imm, 0, 0,
                    0, 0, w, h, GDK_RGB_DITHER_NORMAL, 0, 0);
        
        
            return FALSE;
        }
        

        【讨论】:

        • 试试gtk_widget_set_app_paintable()?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-14
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        相关资源
        最近更新 更多