读书人

GTK 相关解决方案

发布时间: 2012-05-01 12:48:58 作者: rapoo

GTK 相关
在做课设。

有个关于GTK的问题求教各位大神们:

1、如果一个窗口由 3 个部分组成:窗体、工具栏、操作区域(有 Entry \ button \ label \ box 等构件)。我想实现的功能是:比如工具栏有 2 个按钮,我按了其中一个按钮 A 后,下面的操作区域显示与 A 相关的内容(比如填一个开房的表,用一个大的 BOX 构件装好),然后我再按工具栏上的 B 按钮,则下面的操作区域与 A 相关的内容不见,显示为与 B 相关的内容(比如现在填一个退房的表)。我不想用 notebook 构件实现这个功能…… ******如何实现这个功能?具体思路是什马?能给个具体点的相关例子的代码不?

2、请问下面的代码为什马运行时出错了……?我的想法是让主函数干净点,让所有的做窗口的函数都放到调用函数里去……

[code=C/C++][/code]
#include<gtk/gtk.h>
#include<stdio.h>
#include<stdlib.h>

void close_main (GtkWidget *widget)
{
gtk_main_quit ();
}

struct ex {
GtkWidget *box;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *button;

};

struct ex *create (gchar **label_text)
{
struct ex *w1;

w1 = (struct ex*) malloc (sizeof(struct ex));

w1->box = gtk_vbox_new(FALSE, 0);
w1->label = gtk_label_new (*label_text);
w1->entry = gtk_entry_new_with_max_length (10);
w1->button = gtk_button_new_with_label (w1->label);

gtk_box_pack_start (GTK_BOX(w1->box), w1->label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(w1->box), w1->entry, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(w1->box), w1->button, FALSE, FALSE, 0);

gtk_widget_show (w1->box);
gtk_widget_show (w1->button);
gtk_widget_show (w1->label);
gtk_widget_show (w1->entry);

return w1;
}

int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *sbox;

struct ex *wm;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT(window),
"delete_event",
G_CALLBACK(close_main),
NULL);
gtk_widget_show (window);

vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER(window), vbox);
gtk_widget_show (vbox);

sbox = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), sbox, FALSE, FALSE, 0);
gtk_widget_show (sbox);

wm = create("button");

gtk_box_pack_start (GTK_BOX(sbox), wm->box, FALSE, FALSE, 0);

gtk_main ();
return 0;
}
[code=C/C++][/code]

求各位大神大牛们指点迷津……


[解决办法]
1.你仍然可以用notebook:你这个问题的本质是需要一个多页摞在一起的元件。Gtk没有单设一个这种元件,但notebook可以gtk_notebook_set_show_tabs()。你把它关上,然后用按钮控制notebook显示哪页。
另外,这种多选一的状态,建议你用toggle button,而不是普通的button。

2.你应当给出详细信息。至少你应当在debugger里跑一跑。windows下,微软的IDE有debug模式;linux里可以用gdb。
[解决办法]
不懂帮顶
[解决办法]
gtk_button_new_with_label的参数需要一个字符串,也就是字符指针。

creat函数原型不合理,参数类型应该用const char*。

用了malloc而也没有free,有内存泄漏,建议gtk的程序不要用malloc管理内存。

一定不要无视编译器的警告。

读书人网 >C++

热点推荐