当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2016-05-10

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


诸位,我的问题是如何处理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));

}




感谢大家赐教!!!

|
这样试试吧。


  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. 

|
一般关注GtkDialog的singal只有response和close.
gtk_dialog_run实际上返回的就是response的结果。
如果不用gtk_dialog_run,可以先设置response的回调,然后gtk_widget_show_all(gtk_dialog)



|
gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(close_window),NULL); 

|
看来gtk 很有气势,

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3