在修改代码中学习-----GTK编程之列表框
要制作向windows一样的资源管理器,那么,添加进程的部分是不可缺少的,于是,就有那种windows下面的ListBox那种配件了,于是,有了下面的代码。
int
main(
int
argc ,
char
**
argv)
{
gtk_init( & argc, & argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), " Linux System Moniter " ); // 标题
// gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); // 默认窗口尺寸大小,有它的话设置不可变大小就有问题
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE); // 窗口不可改变
gtk_widget_set_usize(GTK_WIDGET (window), 400 , 415 );
g_signal_connect(G_OBJECT(window), " destroy " , G_CALLBACK(gtk_main_quit), NULL); // 将窗口关闭信息与destroy_window关联
main_vbox = gtk_vbox_new (FALSE, 10 ); // 创建一个竖直的布局容器
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1 ); // 设定这个容器和周围的间距
gtk_container_add (GTK_CONTAINER (window), main_vbox); // 将这个布局容器添加到整个视窗的容器中
gtk_widget_show (main_vbox);
GtkWidget * status_bar = gtk_statusbar_new ();
gtk_box_pack_end(GTK_BOX(main_vbox), status_bar, TRUE, TRUE, 0 ); // 将状态栏也加入到竖直控件中,end表示是在最底部添加的此控件
gtk_widget_show (status_bar);
GtkWidget * notebook = gtk_notebook_new ();
gtk_box_pack_end(GTK_BOX(main_vbox),notebook,TRUE,TRUE, 0 ); // 在顶部添加一个标签页,这样就可以实现多重标签了
gtk_widget_show_all (window); // 显示所有的窗口和界面
GtkWidget *frame1 = gtk_frame_new ("CPU info"); //创建第一个简单的标签页
gtk_container_set_border_width (GTK_CONTAINER (frame1), 10);
gtk_widget_set_size_request (frame1, 100, 335);
gtk_widget_show (frame1);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame1, gtk_label_new("CPU"));
GtkWidget *scrolled_window=gtk_scrolled_window_new(NULL,NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);
gtk_container_add (GTK_CONTAINER (frame1), scrolled_window);
gtk_widget_show(scrolled_window);
gchar *cols[6]={"NAME", "PID" , "STATUS", "TIME(S)" , "MEMORY(KB)","PRIORITY"};
GtkWidget *clist=gtk_clist_new_with_titles(6,cols);
g_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(selection_made),NULL); //此处中的函数没有任何作用就设置未NULL,否则选中的就要发生对应的变化
gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_OUT);
gtk_clist_set_column_width(GTK_CLIST(clist),0,64);//设置某个列和对应的宽度,第一个数是列数,第二个是宽度
gtk_clist_set_column_width(GTK_CLIST(clist),1,30);
gtk_clist_set_column_width(GTK_CLIST(clist),2,55);
gtk_clist_set_column_width(GTK_CLIST(clist),3,64);
gtk_clist_set_column_width(GTK_CLIST(clist),4,64);
gtk_clist_set_column_width(GTK_CLIST(clist),5,60);
gtk_container_add(GTK_CONTAINER(scrolled_window),clist);
gtk_widget_show(clist);
…………………………
}
{
gtk_init( & argc, & argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), " Linux System Moniter " ); // 标题
// gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); // 默认窗口尺寸大小,有它的话设置不可变大小就有问题
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE); // 窗口不可改变
gtk_widget_set_usize(GTK_WIDGET (window), 400 , 415 );
g_signal_connect(G_OBJECT(window), " destroy " , G_CALLBACK(gtk_main_quit), NULL); // 将窗口关闭信息与destroy_window关联
main_vbox = gtk_vbox_new (FALSE, 10 ); // 创建一个竖直的布局容器
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1 ); // 设定这个容器和周围的间距
gtk_container_add (GTK_CONTAINER (window), main_vbox); // 将这个布局容器添加到整个视窗的容器中
gtk_widget_show (main_vbox);
GtkWidget * status_bar = gtk_statusbar_new ();
gtk_box_pack_end(GTK_BOX(main_vbox), status_bar, TRUE, TRUE, 0 ); // 将状态栏也加入到竖直控件中,end表示是在最底部添加的此控件
gtk_widget_show (status_bar);
GtkWidget * notebook = gtk_notebook_new ();
gtk_box_pack_end(GTK_BOX(main_vbox),notebook,TRUE,TRUE, 0 ); // 在顶部添加一个标签页,这样就可以实现多重标签了
gtk_widget_show_all (window); // 显示所有的窗口和界面
GtkWidget *frame1 = gtk_frame_new ("CPU info"); //创建第一个简单的标签页
gtk_container_set_border_width (GTK_CONTAINER (frame1), 10);
gtk_widget_set_size_request (frame1, 100, 335);
gtk_widget_show (frame1);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame1, gtk_label_new("CPU"));
GtkWidget *scrolled_window=gtk_scrolled_window_new(NULL,NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);
gtk_container_add (GTK_CONTAINER (frame1), scrolled_window);
gtk_widget_show(scrolled_window);
gchar *cols[6]={"NAME", "PID" , "STATUS", "TIME(S)" , "MEMORY(KB)","PRIORITY"};
GtkWidget *clist=gtk_clist_new_with_titles(6,cols);
g_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(selection_made),NULL); //此处中的函数没有任何作用就设置未NULL,否则选中的就要发生对应的变化
gtk_clist_set_shadow_type(GTK_CLIST(clist),GTK_SHADOW_OUT);
gtk_clist_set_column_width(GTK_CLIST(clist),0,64);//设置某个列和对应的宽度,第一个数是列数,第二个是宽度
gtk_clist_set_column_width(GTK_CLIST(clist),1,30);
gtk_clist_set_column_width(GTK_CLIST(clist),2,55);
gtk_clist_set_column_width(GTK_CLIST(clist),3,64);
gtk_clist_set_column_width(GTK_CLIST(clist),4,64);
gtk_clist_set_column_width(GTK_CLIST(clist),5,60);
gtk_container_add(GTK_CONTAINER(scrolled_window),clist);
gtk_widget_show(clist);
…………………………
}
此部分的这句代码 g_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(selection_made),NULL)
如果将selection_made函数的地方置为NULL,那么,程序是可以正常运行,不过,最后会发生错误。显示:
(mytest:6112): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `c_handler != NULL' failed
根据错误之处就可以定位到函数部分。也就是说,回调函数处不能赋值为空。
注意此函数的作用,就是当选择了某列的时候,调用selection_made来做某项修改的,如果不需要,大可不必要添加这部分。当然,程序开始编写没必要,不过后面会有需要,所以,这里先列出来!
切记:不可画蛇添足,要充分的理解原代码的意思。