GtkDialog事件问题,救急!已经一晚上睡不着了。

时哲 2008-10-21 12:31:34

诸位,我的问题是如何处理GtkDialog信号。现在我想设计一个对话框,提示是否关闭主窗口,请大家帮我看看,为什么关闭时会提示错误:GLib-GObject-WARNING **: /build/buildd/glib2.0-2.16.4/gobject/gsignal.c:1669: signal `GTK_RESPONSE_REJECT' is invalid for instance `0x8424858'

源码如下:


#include "interface.h"

// 这个就是关闭窗口的指令
void close_window(GtkWidget *dialog,
//gchar *handle,
GtkWidget *window){
/* Close window without exit program*/
gtk_widget_destroy(window); //运行到这里出错,窗口无法关闭
}

//这个是取消按钮的回调,生成一个gtk_dialog,显示正常
void close_window_dialog(GtkButton *widget,
GtkWindow *window){

GtkWidget *dialogCloseWindow;
GtkWidget *lbClose;
GtkWidget *imgClose;
GtkWidget *hbClose;
/* Create a new dialog with one OK button. */
dialogCloseWindow = gtk_dialog_new_with_buttons ("Close Window",
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_STOCK_CANCEL,
GTK_RESPONSE_REJECT,
GTK_STOCK_OK,
GTK_RESPONSE_OK,
NULL);
gtk_widget_set_name(GTK_WIDGET(dialogCloseWindow),"modelwindow");
lbClose = gtk_label_new ("Do you want close this window?");

imgClose = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO,
GTK_ICON_SIZE_DIALOG);

hbClose = gtk_hbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (hbClose), 10);
gtk_box_pack_start_defaults (GTK_BOX (hbClose), imgClose);
gtk_box_pack_start_defaults (GTK_BOX (hbClose), lbClose);

/* Pack the dialog content into the dialog's GtkVBox. */
gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG (dialogCloseWindow)->vbox),
hbClose);
gtk_widget_show_all (dialogCloseWindow);

/* Create the dialog as modal and destroy it when a button is clicked. */
gtk_dialog_run (GTK_DIALOG (dialogCloseWindow));

/* Dialog Event */
g_signal_connect (dialogCloseWindow,
"GTK_RESPONSE_REJECT",
G_CALLBACK (close_window),
(gpointer) window);
gtk_widget_destroy(dialogCloseWindow);




}

//主程序,我把无关部分已删除
void
create_winNewplan ( HildonProgram* hilpro )
{
…………………………………………

g_signal_connect (G_OBJECT (btCancel), "clicked",
G_CALLBACK (close_window_dialog),
(gpointer) winNewplan); //这里是主窗口点击按钮btCancel时的回调,
//可以看见对话框弹出。

…………………………………………

/* Show Window */
gtk_widget_show_all(GTK_WIDGET(winNewplan));

}




感谢大家赐教!!!
...全文
710 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pauldeng_007 2010-11-19
  • 打赏
  • 举报
回复
running dialog:

gint result = gtk_dialog_run(GTK_DIALOG(dialog));
if (result == GTK_RESPONSE_OK)
gtk_widget_destroy(dialog);
程序员@中年 2008-10-25
  • 打赏
  • 举报
回复

dialog = gtk_dialog_new_with_buttons(_("Send file"),
NULL,
GTK_DIALOG_MODAL,
_("Send"), RESPONSE_OK,
_("Cancel"), RESPONSE_CANCEL,
NULL
);

gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->vbox), GTK_WIDGET(radio_box), FALSE, FALSE, 0);
gtk_widget_show_all(dialog);

if (gtk_dialog_run (GTK_DIALOG (dialog)) == RESPONSE_OK)
{
.........
}

gtk_widget_destroy (dialog);


这个运行到gtk_widget_destroy (dialog);
时,
会有这样的问题GLib-GObject-WARNING **: ../.././gobject/gsignal.c:1741: instance `0x58ae0' has no handler with id `31'
(!) [ 1415: 125.101] --> Caught signal 11 (at (nil), invalid address) <--
(!) Direct/Thread: Canceling 'Fusion Dispatch' (1416)!
就挂了。
求教。
  • 打赏
  • 举报
回复
应该有个MESSAGEBOX之类的东西可以掉用吧。。。
once_and_again 2008-10-21
  • 打赏
  • 举报
回复
看来gtk 很有气势,
时哲 2008-10-21
  • 打赏
  • 举报
回复
你这个诸葛亮来得很及时,也非常必要。我现在还有个对话框问题要解决,搞不懂再向你请教。


[Quote=引用 7 楼 lidi82 的回复:]
一般关注GtkDialog的singal只有response和close.
gtk_dialog_run实际上返回的就是response的结果。
如果不用gtk_dialog_run,可以先设置response的回调,然后gtk_widget_show_all(gtk_dialog)


引用 5 楼 shizhebsys 的回复:
TMD!
自己解决了。加了一个代码

C/C++ code  /* Create the dialog as modal and destroy it when a button is clicked. */
stutus = gtk_dialog_run (GTK_DIALOG (dialogCloseWindow));


[/Quote]
lidi82 2008-10-21
  • 打赏
  • 举报
回复
一般关注GtkDialog的singal只有response和close.
gtk_dialog_run实际上返回的就是response的结果。
如果不用gtk_dialog_run,可以先设置response的回调,然后gtk_widget_show_all(gtk_dialog)


[Quote=引用 5 楼 shizhebsys 的回复:]
TMD!
自己解决了。加了一个代码

C/C++ code /* Create the dialog as modal and destroy it when a button is clicked. */
stutus = gtk_dialog_run (GTK_DIALOG (dialogCloseWindow));

printf("%d\n",stutus);

if (stutus == -5) {
gtk_widget_destroy(GTK_WIDGET(window));
}



gtk_dialog_new_with_buttons根本不需要回调函数,就可以处理了。

还是要感谢你们,辛苦了!我…
[/Quote]
lidi82 2008-10-21
  • 打赏
  • 举报
回复
这样试试吧。


gint result = gtk_dialog_run (GTK_DIALOG (dialogCloseWindow));
switch (result)
{
case GTK_RESPONSE_REJECT:
gtk_widget_destroy (GTK_WIDGET(window));
break;
case GTK_RESPONSE_OK:
//
break;
default:
break;
}
gtk_widget_destroy (dialogCloseWindow);

另外注意一下你连接回调函数时的指针,你连接的时候是gpointer,回调函数定义的是GtkWindow和GtkWidget.
时哲 2008-10-21
  • 打赏
  • 举报
回复
TMD!
自己解决了。加了一个代码
   /* Create the dialog as modal and destroy it when a button is clicked. */
stutus = gtk_dialog_run (GTK_DIALOG (dialogCloseWindow));

printf("%d\n",stutus);

if (stutus == -5) {
gtk_widget_destroy(GTK_WIDGET(window));
}


gtk_dialog_new_with_buttons根本不需要回调函数,就可以处理了。

还是要感谢你们,辛苦了!我的经验是中午睡个觉,下午一起来就能开胡。
时哲 2008-10-21
  • 打赏
  • 举报
回复
大哥,我的问题不是连接不了回调函数,而是该函数不能关闭我的主窗口。

[Quote=引用 3 楼 xiaomajiadexiaozhang 的回复:]
gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(close_window),NULL);
[/Quote]
  • 打赏
  • 举报
回复
gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(close_window),NULL);
  • 打赏
  • 举报
回复
http://hackbase.com/lib/2006-05-19/33385.html

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧