
有人能给我指路吗?
提前致谢.
———————————————–
好.我发布了一段代码.当我执行程序时,单击“打开窗口”按钮.打开一个新窗口,单击“关闭”按钮.如果我单击“关闭”按钮,我在终端中得到下一个错误:(Windows:13801):Gtk-CRITICAL **:gtk_Widget_destroy:断言`GTK_IS_Widget(小部件)’失败
代码是:
#include <stdlib.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>voID open_window(GtkWidget *Widget,gpointer window);voID close_window(GtkWidget *Widget,gpointer window);int main( int argc,char *argv[]){ GtkWidget *window; GtkWidget *fixed; GtkWidget *button; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_topLEVEL); gtk_window_set_Title(GTK_WINDOW(window),"windows"); gtk_window_set_default_size(GTK_WINDOW(window),230,150); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); fixed = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window),fixed); button = gtk_button_new_with_label("Open window"); gtk_fixed_put(GTK_FIXED(fixed),button,50,50); gtk_Widget_set_size_request(button,80,35); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(open_window),G_OBJECT(window)); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NulL); gtk_Widget_show_all(window); gtk_main(); return 0;}voID open_window(GtkWidget *Widget,gpointer window){ GtkBuilder *builder; GtkWidget *seconDWindow = NulL; builder = gtk_builder_new (); gtk_builder_add_from_file (builder,"seconDWindow.glade",NulL); seconDWindow = GTK_Widget (gtk_builder_get_object (builder,"seconDWindow")); gtk_builder_connect_signals (builder,NulL); g_object_unref (G_OBJECT (builder)); gtk_window_set_modal(GTK_WINDOW(seconDWindow),TRUE); gtk_Widget_show_all(seconDWindow);}voID close_window(GtkWidget *Widget,gpointer window){ gtk_Widget_destroy(GTK_Widget(window));} 在文件“seconDWindow.glade”中定义了一个窗口,一个表和一个放在表格中间单元格中的按钮.此外,它还定义了名为“close_window”的“clicked”事件按钮的句柄.
如果有人想要执行它,请链接到glade文件:https://sites.google.com/site/marvalsiteimages/secondWindow.glade
我希望这可以帮助你理解我的问题.
Thansk.
————————————————-
基于响应的最终代码:
voID open_window(GtkWidget *Widget,gpointer window){ GtkBuilder *builder; GtkWidget *seconDWindow = NulL; GtkWidget *closebutton = NulL; builder = gtk_builder_new (); gtk_builder_add_from_file (builder,"seconDWindow")); closebutton = GTK_Widget (gtk_builder_get_object (builder,"closeWindowbutton")); g_signal_connect (G_OBJECT (closebutton),G_CALLBACK (close_window),G_OBJECT (seconDWindow)); // here is the magic: the callback will get the window to close g_object_unref (G_OBJECT (builder)); gtk_window_set_modal(GTK_WINDOW(seconDWindow),TRUE); gtk_Widget_show_all(seconDWindow);}解决方法 您的问题是第二个窗口的按钮的“单击”信号是从glade文件连接的.但是信号处理程序需要一个指向窗口的指针来销毁它.这通过信号回调的“user_data”参数传递. 一种方法是将第二个窗口作为Glade中的user_data参数传递(看一下这个Glade tutorial),但是参数应该是一个指针,我不知道如何用glade做到这一点.编辑:只需在glade中单击与此信号关联的用户数据字段,d出窗口将允许您选择要传递给信号处理程序的对象.只需选择“seconDWindow”对象即可.
另一种方法是从glade文件中删除信号处理,并手动连接代码中的单击信号,将指针作为用户数据传递给第二个窗口:
voID open_window(GtkWidget *Widget,TRUE); gtk_Widget_show_all(seconDWindow);}总结
以上是内存溢出为你收集整理的gtk – 关闭窗口表单,带有C中的按钮全部内容,希望文章能够帮你解决gtk – 关闭窗口表单,带有C中的按钮所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)