Chinaunix

标题: GTK+中怎样对已存在widget添加信号? [打印本页]

作者: jjj137    时间: 2009-02-23 21:12
标题: GTK+中怎样对已存在widget添加信号?
比如我要对一个窗口添加一个信号,然后在其他回调函数中触发它。
主函数中:
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_new ("signal_error", G_TYPE_FROM_CLASS (G_OBJECT (window)),
            G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 0, NULL, NULL,
            g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0
            );
    g_signal_connect (G_OBJECT (window), "signal_error", G_CALLBACK (show_error), NULL);

回调函数中:
    g_signal_emit_by_name (G_OBJECT (window), "signal_error", NULL);

其中window是全局的。
可是运行到信号触发时没有触发,却出现警告和断言:
GLib-GObject-CRITICAL **: g_signal_newv: assertion `G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype)' failed
GLib-GObject-WARNING **: gsignal.c:2267: signal `signal_error' is invalid for instance `0x18c0000'
GLib-GObject-WARNING **: invalid (NULL) pointer instance
GLib-GObject-CRITICAL **: g_signal_emit_by_name: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
GLib-GObject-WARNING **: invalid (NULL) pointer instance
GLib-GObject-CRITICAL **: g_signal_emit_by_name: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed


网上查到的都是过时的代码,或者是自建的widget类型,怎样往已存在的widget中添加信号呢?
作者: jjj137    时间: 2009-02-26 18:57
没人理,自己顶一下。
作者: openxing    时间: 2009-03-01 00:46
继承GtkWindow写一个新的控件应该是没问题的.也许还有更简单的办法,没有尝试过了.
作者: jjj137    时间: 2009-03-01 12:49
原帖由 openxing 于 2009-3-1 00:46 发表
继承GtkWindow写一个新的控件应该是没问题的.也许还有更简单的办法,没有尝试过了.

那样很麻烦啊,尤其是用C写……用其他方法绕过了……
作者: snyh    时间: 2009-08-09 10:40
g_signal_new ("signal_error", G_TYPE_FROM_CLASS (G_OBJECT (window)),
            G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, 0, NULL, NULL,
            g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0
            );

这有问题。。。。。g_signal_new的第二个参数是 GType  
G_TYPE_FROM_CLASS (G_OBJECT (window))  你这是干什么?  看名字也知道错了
window是一个instance你用G_TYPE_FROM_CLASS肯定错了 应该用
G_TYPE_FROM_INSTANCE()




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2