GTK 相关解决方案
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管理内存。
一定不要无视编译器的警告。
在做课设。
有个关于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管理内存。
一定不要无视编译器的警告。