免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6477 | 回复: 6
打印 上一主题 下一主题

請教 gtk_widget_destroy 令程序全關掉 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-23 17:34 |只看该作者 |倒序浏览
各位好,
本人有一個關於 gtk_widget_destroy. 它可以關閉特定的widget.現在我的問題是...

我有一個結構如下, 方便全局使用.

  1. typedef struct gtk_struct
  2. {
  3.    GtkWidget *window;
  4. }gtk_struct;

  5. struct gtk_struct my_gtk;
复制代码


但當我使用 gtk_widget_destroy(my_gtk.window); 時, 程個程序會關掉.
而當不使用struct結構時, 就可以用 gtk_widget_destroy 去關閉特定的widget, 現在我只有使用 gtk_widget_hide(my_gtk.window) 來頂替, 感覺並不是太好.
所以請教各位我應該怎去改正, 使 gtk_widget_destroy(my_gtk.window) 時不會關掉整個程序. 謝謝.

论坛徽章:
0
2 [报告]
发表于 2006-11-23 21:25 |只看该作者
你的 my_gtk.window 可能是你程序中唯一的一个 toplevel 窗口,所以 gtk_widget_destroy() 之后整个程序就结束了。这是很正常的,没有必要去改正什么。

论坛徽章:
0
3 [报告]
发表于 2006-11-24 16:49 |只看该作者
原帖由 whyglinux 于 2006-11-23 21:25 发表
你的 my_gtk.window 可能是你程序中唯一的一个 toplevel 窗口,所以 gtk_widget_destroy() 之后整个程序就结束了。这是很正常的,没有必要去改正什么。


謝謝您.

但我是有另一個 gtk_window_toplevel 的. 我的程序是這樣, 一啟動時會顯示一個 window, 它是輸入密碼的. 正確後就會關掉這個輸入密碼的widget, 而顯示正式使用的widget, 而這部份就是我的問題所在, gtk_widget_destroy 把 輸入密碼的 window close掉時, 整個也關掉.

但若果是 gtk_widget_hide 時, 會不會很浪費系統資源, 令程序 loading 重左呢..

請你再指教.

還有再請教一事.
我想再一個widget上加入背景圖, 而所有entry, button 等都會顯示在背景圖最上.

再請您指教. 謝謝.

论坛徽章:
0
4 [报告]
发表于 2006-11-24 22:05 |只看该作者
注意一下两个 toplevel 窗口的处理顺序就可以了:在用 gtk_widget_destroy 销毁密码窗口之前显示你的另一个主窗口。

加入背景图可以通过设置 style (gtk_widget_set_style())或 设置 rc (gtk_rc_xxx())来实现。

论坛徽章:
0
5 [报告]
发表于 2006-12-01 15:17 |只看该作者
原帖由 whyglinux 于 2006-11-24 22:05 发表
注意一下两个 toplevel 窗口的处理顺序就可以了:在用 gtk_widget_destroy 销毁密码窗口之前显示你的另一个主窗口。

加入背景图可以通过设置 style (gtk_widget_set_style())或 设置 rc (gtk_rc_xxx())来实 ...


謝謝 wyglinux,
我已經是在gtk_widget_destroy 销毁密码窗口之前显示你的另一个主窗口, 但始終都不能用gtk_widget_destroy, 不知是否跟我使用了gdk_threads 的問題呢.

能給出一段代碼給我去學習嗎. 謝謝.

论坛徽章:
0
6 [报告]
发表于 2006-12-03 13:07 |只看该作者
  1. #include <gtk/gtk.h>

  2. // Global variables.
  3. GtkWidget* main_window;
  4. GtkWidget* pass_window;

  5. void
  6. on_main_window_destroy( GtkWidget *widget,
  7.                         gpointer   data )
  8. {
  9.   gtk_main_quit();
  10. }

  11. // Clicking OK button will show main window and close pass window.
  12. void
  13. on_ok_button_clicked( GtkWidget *widget,
  14.                       gpointer   data )
  15. {
  16.   gtk_widget_show( main_window );
  17.   gtk_widget_destroy( GTK_WIDGET(pass_window) );
  18. }

  19. int
  20. main( int argc, char* argv[] )
  21. {
  22.   GtkWidget* ok_button;

  23.   gtk_init( &argc, &argv );

  24.   // The main window.
  25.   main_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
  26.   gtk_window_set_title( GTK_WINDOW(main_window), "Main" );
  27.   g_signal_connect( G_OBJECT(main_window), "destroy",
  28.                     G_CALLBACK(on_main_window_destroy), NULL );

  29.   // The pass window.
  30.   pass_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
  31.   gtk_window_set_title( GTK_WINDOW(pass_window), "Pass" );

  32.   // The OK button.
  33.   ok_button = gtk_button_new_from_stock( GTK_STOCK_OK );
  34.   g_signal_connect( G_OBJECT(ok_button), "clicked",
  35.                     G_CALLBACK(on_ok_button_clicked), pass_window );
  36.   gtk_container_add( GTK_CONTAINER(pass_window), ok_button );
  37.   gtk_widget_show( ok_button );

  38.   // Show the pass window.
  39.   gtk_widget_show( pass_window );

  40.   gtk_main();

  41.   return 0;
  42. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-12-04 11:00 |只看该作者
謝謝 whyglinux,
我就你的程序作了一些修改. 這個方法就是我現在程序的方法. 請你再給我些指導. 謝謝.


  1. #include <gtk/gtk.h>

  2. // Global variables.
  3. typedef struct main_global_struct
  4. {
  5.     GtkWidget* main_window;
  6. }main_global_struct;

  7. typedef struct pass_global_struct
  8. {
  9.     GtkWidget* pass_window;
  10. }pass_global_struct;

  11. static main_global_struct main_main;
  12. static pass_global_struct pass_pass;
  13. void create_main(void);
  14. void create_pass(void);

  15. void
  16. on_main_window_destroy( GtkWidget *widget,
  17.                         gpointer   data )
  18. {
  19.   gtk_main_quit();
  20. }

  21. // Clicking OK button will show main window and close pass window.
  22. void
  23. on_ok_button_clicked( GtkWidget *widget,
  24.                       gpointer   data )
  25. {
  26.   //gtk_widget_show( main_main.main_window );
  27.   create_main();
  28.   gtk_widget_destroy( GTK_WIDGET(pass_pass.pass_window) );
  29. }

  30. void create_main(void)
  31. {
  32.   // The main window.
  33.   main_main.main_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
  34.   gtk_window_set_title( GTK_WINDOW(main_main.main_window), "Main" );
  35.   g_signal_connect( G_OBJECT(main_main.main_window), "destroy",
  36.                     G_CALLBACK(on_main_window_destroy), NULL );

  37.   gtk_widget_show(main_main.main_window);
  38. }

  39. void create_pass(void)
  40. {
  41.   GtkWidget* ok_button;

  42.   // The pass window.
  43.   pass_pass.pass_window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
  44.   gtk_window_set_title( GTK_WINDOW(pass_pass.pass_window), "Pass" );

  45.   // The OK button.
  46.   ok_button = gtk_button_new_from_stock( GTK_STOCK_OK );
  47.   g_signal_connect( G_OBJECT(ok_button), "clicked",
  48.                     G_CALLBACK(on_ok_button_clicked), NULL);
  49.   gtk_container_add( GTK_CONTAINER(pass_pass.pass_window), ok_button );
  50.   gtk_widget_show( ok_button );

  51.   gtk_widget_show(pass_pass.pass_window);
  52. }

  53. int main(int argc, char *argv[])
  54. {
  55.     gtk_init(&argc, &argv);

  56.     create_pass();

  57.     gtk_main();
  58.     return 0;
  59. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP